Zeichenketten < Softwaretechnik+Pro < Praktische Inform. < Hochschule < Informatik < Vorhilfe
|
n'abend, wollte mal verschiedene methoden zum einlesen von strings anwenden. ergebnis is untenstehend. meine frage ist nun warum funkt dat prog nich? problem bei der ausführung is, dass die letzte funktion (f_fgets) übersprungen wird. es kommt zwar noch die ausgabe wo zur zeicheneingabe gebeten wird, dann aber is schluss. also wird nicht übersprungen sondern die eingabe kann nicht gemacht werden.
ferner frag ich mich, warum bei fgets, wenn ich es direkt nach den ersten beiden funktionen aufrufe, die scanf-funktion überspring, dann funkt es, 9 zeichen ausgegeben werden, wo doch zwei zeichen durch fgets angehängt werden. ein newlinezeichen und das terminierende nullbyte, müssten also eigentlich nur 8 zeichen sein, oder?
#include <stdio.h>
#include <conio.h> // für getch
#include <stdlib.h> // für fgets
#define MAX 10
/*****
* FUNKTION MIT GETCH
**********************/
void f_getch (){
char a[MAX];int i;
[mm] printf("\n\nGib [/mm] 10 Zeichen ein (getch): ");
for (i=0;i<MAX;i++)
a[i]=getch();
[mm] printf("\n\n");//Deine [/mm] eingegebenen Zeichen: ");
for (i=0;i<MAX;i++)
printf("%c",a[i]);
printf("-----");
}
/*****
* FUNKTION MIT GETCHE
***********************/
/* Wie oben nur mit 'getche'm mit Echo */
void f_getche (){
char b[MAX];int i;
[mm] printf("\n\n\nGib [/mm] 10 Zeichen ein (getche): ");
for (i=0;i<MAX;i++)
b[i]=getche();
[mm] printf("\n\nDeine [/mm] eingegebenen Zeichen: ");
for (i=0;i<MAX;i++)
printf("%c",b[i]);
printf("-----");
}
/*****
* FUNKTION MIT SCANF
*********************/
void f_scanf(){
char c[MAX];
[mm] printf("\n\n\nGib [/mm] Zeichen ein (scanf): ");
scanf("%s",c); // pufferüberlauf problem space
printf("%s",c);
}
/*****
* FUNKTION MIT FGETS
*********************/
void f_fgets(){
char d[MAX];
[mm] printf("\n\n\nGib [/mm] 10 Zeichen ein (fgets): ");
fgets(d, MAX, stdin);
printf("%s",d);
[mm] printf("-----\n\n\n");
[/mm]
}
/*****
* HAUPTFUNKTION
*****************/
int main(){
f_getch(); // ohne Echo auf dem Bildschirm
f_getche(); // mit Echo auf dem Bildschirm 'getchE'
f_scanf(); //
f_fgets(); // filegetstring
return 0;
}
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 12:02 Di 06.03.2007 | Autor: | Marc |
Hallo,
> n'abend, wollte mal verschiedene methoden zum einlesen von
> strings anwenden. ergebnis is untenstehend. meine frage ist
> nun warum funkt dat prog nich? problem bei der ausführung
> is, dass die letzte funktion (f_fgets) übersprungen wird.
> es kommt zwar noch die ausgabe wo zur zeicheneingabe
> gebeten wird, dann aber is schluss. also wird nicht
> übersprungen sondern die eingabe kann nicht gemacht
> werden.
Meine Vermutung ist, dass der Eingabepuffer nach Beendigung von scanf nicht leer ist, sondern z.B. noch die Whitespaces enthält, die zur Beendigung der Eingabe bei scanf geführt haben. Diese Zeichen führen dann beim anschließenden Aufruf von fgets direkt zur Beendigung (sozusagen eine leere Eingabe). Die Lösung sollte also sein, den Eingabepuffer nach Aufruf von scanf zu leeren.
> ferner frag ich mich, warum bei fgets, wenn ich es direkt
> nach den ersten beiden funktionen aufrufe, die
> scanf-funktion überspring, dann funkt es, 9 zeichen
> ausgegeben werden, wo doch zwei zeichen durch fgets
> angehängt werden. ein newlinezeichen und das terminierende
> nullbyte, müssten also eigentlich nur 8 zeichen sein,
> oder?
Soweit ich es verstanden habe, liest fgets 9 Zeichen ein, inklusive dem Newlinezeichen. Dann hängt es ein Nullbyte an, so dass der Speicherbereich von 10 Zeichen nicht überschritten wird. Die Längenangabe enthält aber das nicht Nullbyte, also ist der String 9 Zeichen lang (das Array, in dem er steht, ist aber 10 Zeichen lang).
Viele Grüße,
Marc
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 01:20 Mi 21.03.2007 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|