[C] scanf("%c", blabla); funktioniert nicht

New member
Tagchen zusammen;
Ich bin total C-Anfänger und kämpfe mich momentan so durch.
Zu meinem Problem. Die Aufgabenstellung lautet:

Schreiben Sie ein Programm mit einer Funktion, die in einer Zeichenkette ein Zeichen sucht und es jeweils durch ein anderes ersetzt. Benutzen Sie den folgenen Prototyp der Funktion zur Lösung der Aufgabe:

void func(char *ptr, char alt, char neu);


Mein Programm funktioniert ja auch soweit, nur leider habe ich es nur hinbekommen wenn ich der Funktion Char-Strings übergebe statt eine normales Char-Zeichen. Jedesmal wenn ich mehrere Charzeichen einlesen(2x scanf("%c", charzeichen);" will kommt der Compiler irgendwie durcheinander und behält nur das letzte eingelesen Char-Zeichen.

Ich hoffe hier kann mir jemand helfen. Falls sonstige Verbesserungen sinnvoll wären nur her damit :)

Vielen Dank im Voraus
hausel

Code:
void func(char *ptr, char[], char[]);

int main()
{
char string1[10];
char alt[10];
char neu[10];
char *ptr;

printf("Gebe String ein: ");
scanf("%s", &string1[0]);
printf("Gebe Suche ein: ");
scanf("%s", &alt[0]);
printf("Gebe Ersetze ein: ");
scanf("%s", &neu[0]);

ptr = &string1[0];
func(ptr, alt, neu);

printf("%s", string1);

system("PAUSE");
return 0;
}
void func(char *ptr, char alt[], char neu[])
{
int i;
for (i=0; i<strlen(ptr); i++)
    {
    if (*(ptr+i) == alt[0])
       {
       *(ptr+i) = neu[0];
       break;
       }
    }
}
 
Jedesmal wenn ich mehrere Charzeichen einlesen(2x scanf("%c", charzeichen);" will kommt der Compiler irgendwie durcheinander und behält nur das letzte eingelesen Char-Zeichen.

Das liegt imho daran, dass beim ersten scanf() nur ein Zeichen eingelesen wird, das "\n" (du dürckst ja Enter) aber noch im Puffer bleibt. Beim nächsten scanf() wird dann dieses \n eingelesen, anstatt dem nächsten Buchstaben.

Lösung ist den Eingabe-Puffer vorher zu leeren. Dafür gibts viele Möglichkeiten, unter Windows wäre fflush(stdin); die einfachste. Das ist zwar nicht wirklich die beste Möglichkeit (siehe ), aber in Anbetracht der Tatsache, dass du auch scanf() zum Einlesen von Strings benutzt (Buffer Overflow!) sollte die Funktion ausreichen... :-D
 
Zuletzt bearbeitet:
Du sollst aber eigentlich für alt und neu nur einzelne chars einlesen, zumindest laut dem gegebenen Prototypen (der erwartet kein char[], sondern nur char!).

probier für die mal
char alt, neu;
scanf("%c",&alt);
scanf("%c",&neu);

fflush musst du wohl trotzdem verwenden.
 
du hast schon recht ;) Hast vllt nicht ganz genau mein ersten Beitrag gelesen. Ich habe nicht von diesem "fflush" gewusst. Deswegen konnte ich die Aufgabe nur mit char[] lösen.
Das war ja dann auch meine eigendliche Frage. Trotzdem Danke ;)
 
Was ich an deinem code nicht genau verstehe ist. Warum du einen dynamischen Characterpointer nimmst. Du könntest theoretisch da dein string1 10 Zeichenlang ist einfach die anderen an deinen String dran hängen. und das ptr sparen. Naja reine förmlichkeiten^^
 
Viele Wege führen nach Rom. :)

Wenn er aber den Text mit Call by Value an die Funktion übergibt muss er den String am Ende auch wieder zurück geben (er will ihn ja in der main() verwenden). Das bedeutet, er muss bei einem 10 Zeichen langen String (ein Char hat 1 Byte) zwei Mal 10 Byte kopieren. Mit einem Pointer sind das nur einmalig 4 Byte. Würde er die Funktion jetzt hundert mal benutzen wäre das schon ein entscheidender Unterschied.

Außerdem ist das C/C++ - da muss in jede Funktion mind. ein Pointer rein. ;)
 
Ja da hast du schon recht. Weiß jetzt nicht was "bitsparender" ist, ein return str oder ein charpointer^^

Was ja auch kurios ist warum er 10 Zeichen lange strings verwendet, wenn er nur einen character einliest. Geht ja auch ein einfacher char und ein "getc()" statt einem "scanf()".
 
char c = 'a';


printf("Geben Sie einen Buchstaben ein\t");
scanf_s("%c", &c,1);
printf("zeichen ist %c\n", c);


switch (c){
case 'f':
printf("Fechten\n");
break;
case 'l':
printf("laufen\n");
break;
case 'a':
printf("schwimmen\n");
break;


default:
printf("keine Angabe\n");
break;
}
 

Online-Statistiken

Zurzeit aktive Mitglieder
1
Zurzeit aktive Gäste
199
Besucher gesamt
200

Neueste Themen

Beliebte Forum-Themen

X
Keine passende Antwort gefunden?