satz in char satz [50] einlesen

Schnelle objektorientierte, kompilierende Programmiersprache.
Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

satz in char satz [50] einlesen

Beitrag von Empire » Mi Jun 24, 2009 4:09 pm

Ich möchte das wenn man zB:
Was ist das?
eingibt das "Was" in satz [0] gespeichert wird
"ist" in satz [1] gespeichert wird
"das" in satz [2] gespeichert wird
und durch das ? die eingabe bende t wirdt.
ich bekomms aber nur so hin das das Buchstaben weise eingelesen wird was mir nicht hilft da das für die auswertung zu umständlich ist.

hat jemand nen Tipp/ geht das überhaupt?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: satz in char satz [50] einlesen

Beitrag von cloidnerux » Mi Jun 24, 2009 4:54 pm

Also, das aufteilen bestimmt, das Beenden durch "?" weis ich im moment nicht.
Ich würde einen Kompletten Text über scanf/fgets oder sonstigem holen und dann auswerten.
Unter C++ mit der Klasse string zb. mit der Funktion substr.
Und Buchstaben weise kann man das auch ein wenig einfacher lösen:

Code: Alles auswählen

char* GetString(char abortChar)
{
   char temp[100];             //musst du an deine Bedürfnisse anpassen
   for(int i = 0; i < 100; i++)
   {
      temp[i] = getchar();
      if(temp[i] == abortChar) break;
   }
   return &temp;
}
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: satz in char satz [50] einlesen

Beitrag von Dirty Oerti » Mi Jun 24, 2009 5:16 pm

Also in char satz [50] wirst du es eh nicht speichern können :)
So wie das jetzt verstanden hab möchtest du einen Satz einlesen, diesen dann in Wörter unterteilen.

Code: Alles auswählen

char *woerter[50];
(Du kannst maximal 50 Wörter speichern, aber..)

Um deine Wörter zu speichern brauchst du natürlich Speicher.
Diesen forderst du an, wenn du ein Wort gefunden hast. (per malloc)

Bevor du das tun kannst, musst du wissen, wie groß dein Wort ist.
Du gehst also in deinem String von einem ' ' (Leerzeichen) zum nächsten (dazwischen ist dein Wort).
Diese Größe an Speicher allokierst du.

Code: Alles auswählen

woerter[WORTNUMMER] = (char*) malloc (WORTLAENGE);
Dann kopierst du dein Wort (du brauchst evtl einen Hilfszeiger auf den Wortanfang) in den frisch angeforderten Speicher.

Und dann geht es weiter, zum nächsten Wort oder bis ein ? oder das Ende des Strings kommt :)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: satz in char satz [50] einlesen

Beitrag von Empire » Mi Jun 24, 2009 6:29 pm

Allso ich hab das jetzt so gelöst:

Code: Alles auswählen

#include <stdio.h>

int s;
char wort1 [25], wort2 [25], wort3 [25], wort4 [25], wort5 [25], wort6 [25], wort7 [25], wort8 [25], wort9 [25], wort10 [25], wort11 [25], wort12 [25], wort13 [25], wort14 [25], wort15 [25], wort16 [25], wort17 [25], wort18 [25], wort19 [25], wort20 [25], wort21 [25], wort22 [25], wort23 [25], wort24 [25], wort25 [25];

int main ()
{
  printf ("Geben sie ihre Frage ein:");
  scanf ("%[^ ]", &wort1);
  if (wort1=="?") goto auswerten;
  scanf ("%[^ ]", &wort2);
  if (wort2=="?") goto auswerten;
  scanf ("%[^ ]", &wort3);
  if (wort3=="?") goto auswerten;
  scanf ("%[^ ]", &wort4);
  if (wort4=="?") goto auswerten;
  scanf ("%[^ ]", &wort5);
  if (wort5=="?") goto auswerten;
  scanf ("%[^ ]", &wort6);
  if (wort6=="?") goto auswerten;
  scanf ("%[^ ]", &wort7);
  if (wort7=="?") goto auswerten;
  scanf ("%[^ ]", &wort8);
  if (wort8=="?") goto auswerten;
  scanf ("%[^ ]", &wort9);
  if (wort9=="?") goto auswerten;
  scanf ("%[^ ]", &wort10);
  if (wort10=="?") goto auswerten;
  scanf ("%[^ ]", &wort11);
  if (wort11=="?") goto auswerten;
  scanf ("%[^ ]", &wort12);
  if (wort12=="?") goto auswerten;
  scanf ("%[^ ]", &wort13);
  if (wort13=="?") goto auswerten;
  scanf ("%[^ ]", &wort14);
  if (wort14=="?") goto auswerten;
  scanf ("%[^ ]", &wort15);
  if (wort15=="?") goto auswerten;
  scanf ("%[^ ]", &wort16);
  if (wort16=="?") goto auswerten;
  scanf ("%[^ ]", &wort17);
  if (wort17=="?") goto auswerten;
  scanf ("%[^ ]", &wort18);
  if (wort18=="?") goto auswerten;
  scanf ("%[^ ]", &wort19);
  if (wort19=="?") goto auswerten;
  scanf ("%[^ ]", &wort20);
  if (wort20=="?") goto auswerten;
  scanf ("%[^ ]", &wort21);
  if (wort21=="?") goto auswerten;
  scanf ("%[^ ]", &wort22);
  if (wort22=="?") goto auswerten;
  scanf ("%[^ ]", &wort23);
  if (wort23=="?") goto auswerten;
  scanf ("%[^ ]", &wort24);
  if (wort24=="?") goto auswerten;
  scanf ("%[^ ]", &wort25);
  if (wort25=="?") goto auswerten;

  auswerten:

  printf (" %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c", wort1[0], wort2[0], wort3[0], wort4[0], wort5[0], wort6[0], wort7[0], wort8[0], wort9[0], wort10[0], wort11[0], wort12[0], wort13[0], wort14[0], wort15[0], wort16[0], wort17[0], wort18[0], wort19[0], wort20[0], wort21[0], wort22[0], wort23[0], wort24[0], wort25[0]);

  return 0;
}
Aber wenn ich das jetzt mit "Wie geht es dir?" ausprobiere wird am schluss nur "W" ausgegeben.
Warum?

mfg
Empire

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: satz in char satz [50] einlesen

Beitrag von Dirty Oerti » Mi Jun 24, 2009 6:40 pm

*autsch*

Das ist kein guter Programmierstil.
Erstmal das goto: ist das wirklich nötig? -> NEIN (siehe FAQ (?) Eintrag).

Dann:

Warum benutzt du zig globale Variablen, wenn es auch mit einem Array gehen würde?
Einen kurzen Einblick siehst du in meinem vorhergehenden Post.

Pack das Ganze in eine Schleife, in der du prüfst, ob es sich um ein Wort handelt, wenn ja, dann forderst du dafür Speicher an und speicherst es, wenn nein und es ein ? ist, dann unterbrichst du die Schleife und gehst zu deinem Codeteil über, in dem du die Wörter auswertest.

Um nochmal auf mein Array vom vorherigen Post zurückzukommen:

Code: Alles auswählen

char *woerter[50];
Das hier ist ein Array aus 50 char*, also aus 50 char-Pointern, die alle auf einen char-String zeigen können.
In einem Charstring kannst du z.B. ein Wort speichern. (char String = Array aus chars, ein char = ein Buchstabe)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: satz in char satz [50] einlesen

Beitrag von Empire » Mi Jun 24, 2009 6:49 pm

zu goto:
bei manchen sachen die ich proggramiert hab geht es nocht anderst (höchstens mit funktionen aber das wär mir da zum ständlich)
auserdem hab ich so meine Prb mit schleifen (versuchs bitte net mir jetzt beizubringen)
Da ich schon viel mit goto gearbeitet habe und NIE prob damit gehabt
aber das is nebensache

ok ich versuchs mal auf deine weise auch wenn ich sie nicht im geringsten verstehe weil ich mit Zeigern noch nie gearbeitet habe
trotzdem würde ich gerne wissen warum meine version nicht funkt.

mfg
Empire

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: satz in char satz [50] einlesen

Beitrag von Empire » Mi Jun 24, 2009 7:03 pm

Wie kann ich wenn ich eine varieable hab zB:
char bsp [6] = "Hallo";
ich hab nur geschaft den 1. buchstaben auszugeben (allso auf einmal)

mfg
Empire

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: satz in char satz [50] einlesen

Beitrag von Dirty Oerti » Mi Jun 24, 2009 7:40 pm

Code: Alles auswählen

printf (" %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c", wort1[0], wort2[0], wort3[0], wort4[0], wort5[0], wort6[0], wort7[0], wort8[0], wort9[0], wort10[0], wort11[0], wort12[0], wort13[0], wort14[0], wort15[0], wort16[0], wort17[0], wort18[0], wort19[0], wort20[0], wort21[0], wort22[0], wort23[0], wort24[0], wort25[0]);
Da steht im Endeffekt: "Gib von jedem "wort" das erste Char aus"

%c im printf steht für char, also ein einzelnes Zeichen.
Um einen String auszugeben musst du %s verwenden.
Dann stimmt die Angabe wort[0] aber nicht, denn diese Angabe würde ja auf das erste Char verweisen.
In dem Fall brauchst du dann glaube ich nur wortX (oder du versuchst es mit &wortX)
zu goto:
bei manchen sachen die ich proggramiert hab geht es nocht anderst (höchstens mit funktionen aber das wär mir da zum ständlich)
auserdem hab ich so meine Prb mit schleifen (versuchs bitte net mir jetzt beizubringen)
Da ich schon viel mit goto gearbeitet habe und NIE prob damit gehabt
aber das is nebensache
*Kopf schüttel*
*Wo ist Xin? Du erklärst das immer so schön*

;) Ich glaube nicht, dass du Sachen programmierst, die ohne ein GOTO nicht möglich werden. Ein GOTO kann man eigentlich IMMER durch Funktionen oder sinnvolleren Programmablauf ersetzen.
Was an deinem Code oben sofort auffällt: Du benutzt keine Funktionen. Schreibst du aber in C/C++/ASM/Java/(...) und benutzt keine Funktionen (wo sie sinnvoll sind), dann ist das wie Autofahren ohne Motor: Sehr mühsam.

Genauso mit Schleifen: Wie lange hat es gedauert, diesen Code oben zu schreiben? Mit einer Schleife (!) könnte man den Code auf deutlich weniger als die Hälfte reduzieren, und er wäre sogar noch schneller (da kann dein Compiler evtl was für dich tun). Lies dir doch am besten den Wiki-Artikel zu Schleifen durch und mach damit ein paar Übungen. Und frag dann, wenn du Probleme hast.

GOTO ist wirklich ein Relikt, ich wage sogar zu behaupten, das GOTO wohl (hoffentlich) mal aus dem Sprachgebrauch verschwindet...
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: satz in char satz [50] einlesen

Beitrag von Xin » Do Jun 25, 2009 8:53 am

Empire hat geschrieben:Allso ich hab das jetzt so gelöst:
Hmm... okay... Dein Code enthält eine Dinge, die für einen C-Einsteiger absolut tabu sind. Das wäre das Goto.
Dann wäre da noch die Sache, die für C-Programmierer, egal ob Profi oder Einsteiger, tabu sind. Das wäre das scanf.

Eine Sünde ist es, Variablen durchzunummerieren.
UNd wenn man das alles rausnimmt, dann sieht der Code so aus:

Code: Alles auswählen

#include <stdio.h>

int s;

int main ()
{
  printf ("Geben sie ihre Frage ein:");

  return 0;
}
Ich würde sagen, nun haben wir eine gute Basis, um die fehlenden Teile zu ergänzen. :-)

Zur Eingabe verwende bitte Systemfunktionen, also beispielsweise Ncurses unter Linux. C bietet Dir ansonsten keine wirklich brauchbaren Eingabemöglichkeiten.
Zu den durchgezählten Variablen: Nimm ein Array: char ** worte;



Dirty Oerti hat geschrieben:
zu goto:
bei manchen sachen die ich proggramiert hab geht es nocht anderst (höchstens mit funktionen aber das wär mir da zum ständlich)
auserdem hab ich so meine Prb mit schleifen (versuchs bitte net mir jetzt beizubringen)
Da ich schon viel mit goto gearbeitet habe und NIE prob damit gehabt
aber das is nebensache
*Kopf schüttel*
*Wo ist Xin? Du erklärst das immer so schön*
Der Code ist nicht wartbar, damit nicht weiterentwickelbar, nicht wiederverwendbar, schlecht lesbar und abgesehen davon ungefähr fünfmal größer als die Lösung des Problems, welches er nicht löst.
Dirty Oerti hat geschrieben:;) Ich glaube nicht, dass du Sachen programmierst, die ohne ein GOTO nicht möglich werden. Ein GOTO kann man eigentlich IMMER durch Funktionen oder sinnvolleren Programmablauf ersetzen.
Gotos stecken überall. Man kann sie in C unstrukturiert nutzen (goto) oder strukturiert: (while, for, if, Funktionsaufrufe).
Dirty Oerti hat geschrieben:und er wäre sogar noch schneller (da kann dein Compiler evtl was für dich tun).
Schneller wäre er vermutlich nicht, eher langsamer, aber dafür fehleranfälliger.
Und da gilt es Prioritäten zu setzen: Lieber ein Problem geringfügig langsamer gelöst, als ein eine schnelle fehlerhafte Antwort.
Dirty Oerti hat geschrieben:GOTO ist wirklich ein Relikt, ich wage sogar zu behaupten, das GOTO wohl (hoffentlich) mal aus dem Sprachgebrauch verschwindet...
Zumindest als Schlüsselwort 'goto'.



Wozu brauchst Du die Aufteilung in Worte?
Wie sieht es damit aus, den Satz komplett einzulesen und dann z.B. strtok zu verwenden?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: satz in char satz [50] einlesen

Beitrag von Empire » Do Jun 25, 2009 6:15 pm

Ich will dass das progg auf fragen antwortet!
Dazu muss das progg den satz auf schlüsselworte durch suchen.

Wer jetzt versucht mir das auszureden/ seine metohde auf drehen will / oder mich auslachen will kann sich das sparen.
Hab ich schon alles gehört.
Danke!
(nur zur vorsorge(ich habs langsam sat))

mfg
Empire

Antworten