2016-09-28 5 views
0

Wenn ich meinen Code unten ausführen. Es wartet auf meine Eingabe zur Eingabe eines Dateinamens. Aber ich warte nicht auf die Eingabe eines Dateinamens, sondern überspringe ihn einfach in den _getch() -Teil. Ich kann keinen Satz hinzufügen.Konsole wartet nicht auf Eingabe. (C-Sprache)

-Code nicht funktioniert:

#include <stdio.h> 

main() { 

    FILE *fp; 
    char fnamer[100] = "";  //Storing File Path/Name of Image to Display 
    printf("\n\nPlease Enter the Full Path of the Image file you want to view: \n"); 
    scanf("%s", &fnamer); 
    fp = fopen(fnamer, "w"); 
    if (fp == NULL) 
    { 
     printf("\n%s\" File NOT FOUND!", fnamer); 
    } 
    char c[1000]; 
    printf("Enter a sentence:\n"); 
    gets(c); 
    fprintf(fp, "%s", c); 
    fclose(fp); 
    _getch(); 
} 

-Code, das funktioniert und wartet auf einen Satz eingeben:

#include <stdio.h> 
#include <stdlib.h> /* For exit() function */ 
int main() 
{ 
    char c[1000]; 
    FILE *fptr; 
    fptr = fopen("program.txt", "w"); 
    if (fptr == NULL){ 
     printf("Error!"); 
     exit(1); 
    } 
    printf("Enter a sentence:\n"); 
    gets(c); 
    fprintf(fptr, "%s", c); 
    fclose(fptr); 
    return 0; 
} 

Beide sind so ähnlich, genau dort am Ende für die Eingabeaufforderung für einen Satz zu fragen. Es macht keinen Sinn.

+1

gebaut Wahrscheinlich nicht verwandt, aber das Ampersand entfernen: 'scanf ("% s", & fnamer);' -> 'scanf ("% s ", fname);' –

+2

[warum-ist-die-bekommt-Funktion-so-gefährlich-dass-es-sollte-nicht-benutzt werden] (http://stackoverflow.com/questions/1694036/why-is -die-bekommt-Funktion-so-gefährlich-dass-es-sollte-nicht-benutzt werden) – LPs

+0

'scanf' ist kompliziert zu verwenden und nutzlos, wenn die Eingabe nicht mit der scanf-Formatzeichenfolge übereinstimmt. Verwenden Sie lieber 'fgets'. –

Antwort

0

Sie müssen Ihre Eingabe nach der Verwendung von scanf spülen.

legte eine getchar() nach jedem Scanf

+1

@LPs tut mir leid. du liegst falsch –

+0

ja, sorry. Ich entfernte. – LPs

+0

Fehlermeldung: Fehler Fehler LNK2019: nicht aufgelöstes externes Symbol __getchar referenziert in Funktion _main – Ansh

0

Sie sind ein sehr häufiges Problem zu begegnen, wenn stdin Eingang zu empfangen verwenden, die nach dem ersten Scanf Anruf ist, gibt es ein baumelnden \ n Charakter, der in klemmt der Puffer von der Enter-Taste. in einer tragbaren einfachen Möglichkeit, fügen Sie so etwas wie

char c; 
while ((c = getchar()) != '\n' && c != EOF) { } 

Dieses einfach initialisiert ein Zeichen, und dann bekommen Anrufe char so oft wie erforderlich, um diesen Puffer zu löschen, bis es erreicht ‚\ n‘ oder ‚EOF‘, Das ist sofort in Ihrem Fall.

tl; dr: Ihr Puffer wie folgt aussieht

hello.txt\n <-- "comes from the enter key" 

und wenn Sie versuchen, erhalten zu verwenden (c) nimmt es die \ n als Schlüssel nächsten eingeben.

+0

Also was wäre Lösung? Die while-Anweisung hinzufügen? – Ansh

+0

Ja, nach dem Scanf. Denken Sie auch daran, keine gets (c) zu verwenden und fgets (c, 1000, stdin) zu verwenden; Dabei ist 1000 die Größe der Zeichenfolge, in die Sie gerade lesen. –

0

Die Regel ist Mischen Sie niemals scanf und [f] erhält. scanf stoppt vor dem nächsten unbenutzten Zeichen, im Allgemeinen ein Leerzeichen, und das Ende der Zeile besteht aus Leerzeichen.

Sie könnten versuchen, einen Dummy fgets zwischen dem letzten scanf und dem ersten echten fgets zu setzen. Dadurch wird sichergestellt, dass Sie jetzt vor dem Lesen an einem Zeilenanfang positioniert sind. Alternativ könnten Sie alles in Zeilen mit fgets lesen und die Zeilen mit sscanf analysieren. Das ist es, was ich bevorzuge, sobald ich möchte, dass meine Eingabe linienorientiert ist. Und immer steuern Rückgabewerte der Eingabefunktionen, es wird vermieden, dass ein Programm plötzlich ohne irgendeine Anzeige verrückt wird, weil ein Eingang einen ignorierten Fehler gab.

Und schließlich und nicht zuletzt: nie gets verwenden, aber nur fgets, ersteres ist seit Jahrzehnten in der Halle der Schande als Ursache für unzählige Buffer Overflows

-Code werden könnte:

#include <stdio.h> 
#include <string.h> 

main() { 

    FILE *fp; 
    char fnamer[100] = "";  //Storing File Path/Name of Image to Display 
    char c[1000], *ix; 
    int cr; 
    printf("\n\nPlease Enter the Full Path of the Image file you want to view: \n"); 
    cr = scanf("%s", &fnamer); 
    if (cr != 1) { 
     // process error or abort with message 
    } 
    fp = fopen(fnamer, "w"); 
    if (fp == NULL) 
    { 
     printf("\n%s\" File NOT FOUND!", fnamer); 
     return 1; // do not proceed after a fatal error! 
    } 
    for(;;) { // read until a newline in input 
     ix = fgets(c, sizeof(c), stdin); 
     if (ix == NULL) { 
      // end of input: abort 
     } 
     if (strcspn(c, "\n") < strlen(c)) break; 
    } 
    printf("Enter a sentence:\n"); 
    ix = fgets(c, sizeof(c), stdin); 
    c[strcspn(c, "\n")] = '\0'; // remove end of line to get same data as gets 
    fprintf(fp, "%s", c); 
    fclose(fp); 
    _getch(); 
} 
0
main() { 

    FILE *fp; 
    char fnamer[100]="";  //Storing File Path/Name of Image to Display 
    printf("\n\nPlease Enter the Full Path of the Image file you want to view: \n"); 
    fgets (fnamer,100,stdin); //fgets(name, sizeof(name), stdin); 
    fp=fopen(fnamer,"w"); 
      if(fp==NULL) 
     { 
      printf("\n%s\" File NOT FOUND!",fnamer); 
      getch(); 
      exit(1); 
     } 

} 

Ich denke, der beste Weg zu tun, verwenden Sie fgets statt scanf, weil fgets() kann jede offene Datei lesen, aber scanf() liest nur Standardeingabe (Benutzer angegeben).

fgets() liest eine Textzeile aus einer Datei; scanf() kann dafür verwendet werden, sondern auch Griffe Konvertierungen von String in numerischen Typen

+0

@Ansh hast du das versucht ?? ist es Arbeit oder nicht ??? – SMW

Verwandte Themen