Schlagen Sie eine alternative für gets () - Funktion, mit gcc-compiler
Versucht, die Eingabe mehr als einen einzigen string in meinem Programm Zeichenfolgen-array, für die verwendet werden :
scanf("%80[^\r\n]", strings[i]);
fgets(string[i], MAXLEN, stdin);
eine maßgeschneiderte Funktion wurde auch verwendet:
int getString(char s[]) {
char ch;
int i=0;
while( (ch = getchar()) != '\n' && ch != EOF ) {
s[i] = ch;
++i;
}
s[i] = '\0';
fflush(stdin);
return i;
}
aber nicht in der Lage eine Eingabe mit mehr als einem string-jeweils inklusive Leerzeichen
Funktion gets()
verwendet, um die Arbeit früher für mich, aber da es veraltet ist, keine alternative gefunden werden kann
Dies ist, wo es verwendet wurde :
int getString(char s[]) {
char ch;
int i=0;
while( (ch = getchar()) != '\n' && ch != EOF ) {
s[i] = ch;
++i;
}
s[i] = '\0';
fflush(stdin);
return i;
}
struct vechileData
{
char vechileType[MAXLEN];
int begin_month;
int end_month;
double price;
} data[5];
int main(int argc, char const *argv[])
{
printf("Input Vechile data: \n");
int i=0;
while(i < 5) {
printf("Input vechile Type : \n");
fgets(data[i].vechileType, MAXLEN, stdin);
printf("Input begin month : \n");
scanf("%d", &data[i].begin_month);
printf("Input end monhth : \n");
scanf("%d", &data[i].end_month);
printf("Input price : \n");
scanf("%lf", &data[i].price);
++i;
}
printf("Input Vechile Type to display information about the vechile : \n");
char vech[MAXLEN];
fgets(vech, MAXLEN, stdin);
i=0;
while(i < 5) {
if (strcmp(vech,data[i].vechileType) == 0)
{
printf("vechileType: %s\n", data[i].vechileType);
printf("Begin month: %d\n", data[i].begin_month);
printf("End month: %d\n", data[i].end_month);
printf("Price : %lf\n", data[i].price);
}
++i;
}
return 0;
}
Überspringt die nächste Eingabe zu einem string-Anweisung während der Laufzeit "scheint"
- Es ist eine schlechte Idee zu
fflush()
die standard-Eingabe, wird die Spülung ist nur gut definiert für output-streams. - Was ist deine eigentliche Frage? Die Funktion fgets nennen sollte funktionieren und das richtige zu tun. Sie wahrscheinlich deklarierten strings falsch, wenn es nicht funktioniert.
- können Sie ein Beispiel mit fgets, dass doesnot Arbeit? Ich Frage deshalb, weil es Sie geben sollte eine ganze Zeile bis zum \n, haben Sie vielleicht noch ein Fehler irgendwo.
- Die alternative zu
gets
istfgets
. - Nicht aufgeben
gets()
, nur weil es veraltet. Aufgebengets()
, weil es gefährlich ist. - die alternative ist bereits beantwortet in diese Frage
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein problem ist wirklich nicht einen
gets()
Problem.Keiner der
scanf("%d", ...)
undscanf("%lf", ...)
verbrauchen die'\n'
nach der Nummer und tragen damit zu Ihrem Problem. Es ist die nächste Lesen vonstdin
zu nehmen, in der'\n'
. Also, wenn das nächste Auto-Typ Lesen ist, bekommt es die veraltete'\n'
. Ihr 2. Auto Art endet als"\n"
.Verwendung von
fgets(data[i].vechileType, MAXLEN, stdin);
stellt eine'\n'
imdata[i].vechileType
. Sie wahrscheinlich nicht wollen, dass diese. Ihre frühere Verwendung vongets()
verbraucht, aber nicht, dass die'\n'
an seine Rückkehr.Ich schon vor langer Zeit gab, das zu tun, Benutzereingaben mit
scanf()
durch diese subtilen Fragen.Empfehlen separaten Eingang von der Parsen, verwenden
fgets()
und dannsscanf()
. Beispiel:Ihre Umsetzung eine
gets()
Ersatz unterscheidet sich wie folgt1) Es nicht zurück
s
(oder NULL Fehler oder eof).2) Es wird nicht festgelegt eof-Indikator auf eof.
3) Sollte
getchar()
Gegenzug eine'\0'
Ihrewhile
Schleife falsch weiter.Empfehlen, dass, wenn Sie muss ersetzen
gets()
, tun Sie dies überfgets()
.Wenn Sie Ersatz-Lösung bewältigen muss Länge der Zeichenfolge > die festen
My_gets_N
andere Codierung benötigt wird.Müssen Sie etwas konkreter über das, was schief gelaufen mit der
fgets()
Ansatz, ich würde empfehlen, und es funktioniert.Beachten Sie, dass
fgets()
- Eingang wird die gesamte Zeile inklusive Zeilenvorschub/Wagenrücklauf am Ende, so müssen Sie möglicherweise zu reinigen, diese aus, wenn Sie unerwünscht zu halten.Ich verstehe nicht, wie
gets()
arbeitete für Sie, trotz der Warnung, dass praktisch jedes C-Buch, post K&R gibt, da es nicht nur veraltet, sondern extrem gefährlich, zu verwenden. Wie die anderen schon sagten,fgets()
würde auf jeden Fall funktionieren, wenn Sie verwendet es richtig.gets()
Funktion definiert ist, zu Lesen Eingaben in einem Puffer bereitgestellt, der durch den Aufrufer, bis zu und einschließlich des ersten newline (oder EOF). Es bietet keinen Mechanismus für die Begrenzung der Eingabe auf die Größe des Puffers, der nur limit, wie vielgets()
Lesen ist "newline oder EOF". Diefgets()
Funktion, zumindest, spezifizieren Sie die Größe des Puffers, die Sie verwenden.Anstatt Sie zu ersetzen Sie alle Instanzen von Anwendungen von
gets
mitfgets
. Verwenden Sie die folgenden Makros:Warum
fgets
?Weil es sicherer ist als
gets
.Ist
gets
wirklich unsicher?Ja. Es ist gierig ja, es nimmt so viel Nahrung wie Sie geben, auch wenn Sie es nicht Essen können.
So technisch, wie @halfer zu Recht kommentiert unten
mit der Nutzung bekommt, das Programm ist anfällig für buffer overflow.
Wie ?
Nun input von mehr als 5 Zeichen, so wird es akzeptieren.
Dies würde überschreiben die Daten aus dem Speicher, die sollten nicht überschrieben werden, auf diese Weise.
Ok mit
fgets
, aber warum TRUNCATE_NULL makro ?fgets
ist auch nicht perfekt. wird es akzeptieren\n
(Enter) als Zeichen im input name.So entfernen Sie unnötige
\n
, und sicherzustellen, dass die erwartete Funktionalität desgets
ist erreicht, wir können es verwenden,.Tatsächlich, dort können Sie
while((getchar())!='\n');
zu vermeiden, eine solche Art von problem und eine Sache gibt es keine Notwendigkeit für die Verwendung von fflush(stdin) - Funktion.Hier ist code, den Sie verwenden können,
Ich hoffe das wird dir helfen.....