Eingegebenen String Vergleichen
-
Sollte ich DirkB recht verstanden haben, möchte er Dir mitteilen, dass man fflush(stdin) tunlichst vermeiden möge. Die Alternative, um Dein damit angepeiltes Ziel zu erreichen findest Du unter dem Link.
Desweiteren würde ich Dir raten, Deine Variable anzahl zu initialisieren (mit i=0; deklarieren).
Angenommen, der lustige Benutzer gibt statt einer Ziffer bzw. Zahl etwas Böses in der Art "Hallo Welt!" ein, wird anzahl von scanf nicht verändert und damit könnte die Variable bei Schleifenbeginn 0, 1, -1337 oder drölf sein. Wenn sie vor dem erfolglosen scanf 0 war, ist sie es danach auch noch.Ansonsten kann man sich Dirk nur anschließen: Das angegebene Beispiel ließe sich mit strcmp(str1, str2) realisieren - ist wohl nicht ganz, was Du suchst...
Also bitte ein aussagekräftiges Beispiel!
-
würmchen schrieb:
Sollte ich DirkB recht verstanden haben, möchte er Dir mitteilen, dass man fflush(stdin) tunlichst vermeiden möge. Die Alternative, um Dein damit angepeiltes Ziel zu erreichen findest Du unter dem Link.
Desweiteren würde ich Dir raten, Deine Variable anzahl zu initialisieren (mit i=0; deklarieren).
Angenommen, der lustige Benutzer gibt statt einer Ziffer bzw. Zahl etwas Böses in der Art "Hallo Welt!" ein, wird anzahl von scanf nicht verändert und damit könnte die Variable bei Schleifenbeginn 0, 1, -1337 oder drölf sein. Wenn sie vor dem erfolglosen scanf 0 war, ist sie es danach auch noch.Ansonsten kann man sich Dirk nur anschließen: Das angegebene Beispiel ließe sich mit strcmp(str1, str2) realisieren - ist wohl nicht ganz, was Du suchst...
Also bitte ein aussagekräftiges Beispiel!Das mag ja sein das fflush nicht besonders geeignet ist aber darum gehts ja garnicht. Und ja das mit dem Wert definieren da magst du auch recht haben aber das Schönheitszeug kann ich noch am schluss machen ich werd da schon noch sachen einbauen die dann nur in meinem fall wörter und keine zahlen zulassen.
Als erstmal versuch ich das genau zu erklären. Ich möchte ein Programm schreiben das mir eine Anzahl von verschiedenen Farben einliest, die Anzahl der farben wird zuvor mittels scanf abgefragt.
Bei der Eingabe von bsp. 5 wiederholt sich die schleife 5 mal und fragt 5 farben ab. diese werden in ein zweidimensinales array eingelesen.also farbe[i][k] (farbe ist mein array, i soll aussagen welche farbe 1,2,3,4,5 und k beinhaltet die einzelnen buchstaben g,e,l,b)
jetzt möcht ich die farben vergleiche also wenn in meinem array farbe[0][0-3] gelb abgelegt ist, dann soll das programm irgendwas berechnen. wenn nicht dann wird weiter geprüft ob farbe[0][0-3] der farbe blau entspricht.
also als beispiel:
if (farbe[i][k] == 'gelb'){ printf("Farbe ist gelb"); }
mein problem ist aber das in meinem array die farbe gelb so abgespeichert ist.
farbe[0][0] => 'g'
farbe[0][1] => 'e'
farbe[0][2] => 'l'
farbe[0][3] => 'b'jetzt weiß ich nicht so genau wie ich das direkt vergleichen kann.
#include <stdio.h> #include <conio.h> #include <string.h> int main(void) { char farbe[5][10]; int anzahl; printf("\n\nAnzahl der Farben:\t"); fflush(stdin); scanf("%i", &anzahl); for (i=0; i<anzahl; i++) { if (i==0){ printf("\n1. Farbe\t"); } else if (i==1) { printf("\n2. Farbe\t"); } else if (i==2) { printf("\n3. Farbe\t"); } else if (i==3) { printf("\n4. Farbe\t"); } else if (i==4) { printf("\n5. Farbe\t"); } else { printf("\nFehlerhafte Eingabe!"); break; } fflush(stdin); scanf("%s", &farbe[i][0]); } if(strcasecmp(farbe[0][], "gelb") == 0) { //so würde ich das gerne vergleichen printf("str1 ist gleich str2!\n"); //geht natürlich nicht } getch(); }
Das was ich Programier ist nur für Schulzwecke, also habt etwas verständnis wenn das im quelltext nicht immer so schön umgesetzt wurde. danke.
-
Lass das zweite Klammernpaar weg: http://codepad.org/XB9O3Dl6
-
ah jetzt funktionierts, danke dir.
-
fflush(stdin) ist nicht nur wenig geeignet, sondern hat im Regelfalle als einzigen Effekt eine Fehlermeldung
Könnte natürlich theoretisch sein, dass ein erfinderischer Compilerprogrammierer fflush auf stdin realisiert hat, muss aber nicht...
Es geht auch darum, dass sich nicht am Ende jemand noch abschaut, dass man fflush so verwenden könnte...Ansonsten warst Du ja schon echt nah dran
-
wo soll ich da ne fehlermeldung bekommen mit fflush(stdin)? bei mir funktionier das einwandfrei...
wir lernen das in der schule so das wir fflush(stdin) verwenden sollen und bis jetzt hatte ich noch nie probleme damit.
-
Es gibt noch andere Hersteller von Compilern als Microsoft. Und die haben sogar den aktuellen Standard größtenteils implementiert.
-
oder anders ausgedrückt:
Ich finde es sinnvoll, eine Programmiersprache so zu lernen, wie sie gedacht ist. Wenn Euer freundlicher Microsoft-Compiler fflush(stdin) erkennt und dann irgendwas (mehr oder weniger sinnvolles) mit dem Eingabestream macht, ist das jetzt am Anfang sicherlich bequem und praktisch. Da muss man sich dann schonmal nicht mit exakter Formatierung erwarteter Eingaben (Scheunen haben zwar Scheunentore - die kann man aber zumachen!) und gewissenhafter Konzeptierung von Programmen (Wenn der Benutzer etwas eingibt, das man ihn hat eingeben lassen, möchte man das im Normalfall nicht einfach in den Müll werfen, sondern irgendwas damit anfangen. Deshalb ist für die allermeisten Fälle ein fflush(stdin) die Abkürzung um den sinnvollen Weg, Stolpersteine zu kennen, zu erkennen und entsprechend zu programmieren.
-
Ich möchte noch anregen die uneffektiven if else if Ketten auszutauschen:
switch(i) { case 0: printf("\n1. Farbe\t"); break; case 1: printf("\n2. Farbe\t"); break; case 2: printf("\n3. Farbe\t"); break; case 3: printf("\n4. Farbe\t"); break; case 4: printf("\n5. Farbe\t"); break; default: printf("\nFehlerhafte Eingabe!"); break; }
Oder in diesem Fall einfacher
switch(i) { case 0: case 1: case 2: case 3: case 4: printf("%d. Farbe\n", i+1); break; default: printf("Fehlerhafte Eingabe!\n"); break; }
Bem: Das Zeilenendezeichen sollte auch am Ende stehen.
Viele UNIX-Systeme geben die Zeile erst aus, wenn sie komplett (oder der IO-Buffer voll) ist.
Im Fehlerfall z.B. sieht man so die letzte Meldung dann auch bevor der Prozess
gekillt wirdPS: Laut Kernighan Ritchie ist fflush nur für stdout definiert. Das hält einige Programmierer aber nicht davon ab es auch für stdin zu verwenden :xmas1:
-
@merano: Mein Vorgesetzter schwört seit gut 20 Jahren auf fflush (stdin)... compiler gcc unter linux, vorher sco bzw unix.
Ich wurde sogar gerügt, weil ich nach meiner Eingaberoutine kein fflush aufrufe
strerror folgt meinem Bauchgefühl mit einem "illegal seek"
-
@würmchen: ich möchte hier verbesserungsvorschläge bekommen und keine dummen kommentare, es mag sein das fflush() nicht die beste methode ist aber dann zeig mir doch einfach wie ich das besser machen kann anstatt nur sinnlose kommentare von dir zu geben.
Außerdem muss du mich hier nicht gleich aufziehen, wir haben das eben so bis jetzt in der schule gehabt deswegen mach ich das auch solange so bis mir jemand eine bessere methode zeigt.@merano: ich dank dir für den hinweis ich werd das bei mir verbessern
-
ami3z schrieb:
... bis mir jemand eine bessere methode zeigt.
Die stand schon in der ersten Antwort. Man muss dann auch mal den Links folgen und das durchlesen.
Noch mal der direkte Link zu der Antwort: http://www.c-plusplus.net/forum/p1146014#1146014
-
ami3z schrieb:
wir lernen das in der schule so das wir fflush(stdin) verwenden sollen und bis jetzt hatte ich noch nie probleme damit.
Tja, dein Lehrer hat keine Ahnung und lehrt euch Schülern diese Ahnungslosigkeit.
Hast Pech gehabt.
Wird dir in deinem späteren Leben noch häufiger passieren.
Gehe davon aus, dass du hier der 1001. Frager bist, der sich zum Thema fflush(stdin) äußert und auch schon mind. der 1001 Naivfrager bist, der mit "bei mir läufts" hier aufschlägt.
Die Fragen sind auch schon 1000x beantworten worden, wer lesen kann (z.B. FAQ), ist klar im Vorteil.
-
würmchen schrieb:
Deshalb ist für die allermeisten Fälle ein fflush(stdin) die Abkürzung um den sinnvollen Weg, Stolpersteine zu kennen, zu erkennen und entsprechend zu programmieren.
Bitte mal auf Deutsch übersetzen.
-
nein, ich denk der lehrer bringt uns das bewusst so bei, ihr müsst bedenken das ich noch ein blutiger anfänger bin und einem anfänger kann man da nicht gleich iwelche komplizierten sachen an den kopf werfen. Ich kann man natürlich auch täuschen und mein lehrer hat wirklich keine ahnung das lass ich mal offen dahingestellt.