2016-11-29 6 views
1

Mein Programm überspringt den nächsten Eingang nach 1 Durchlauf. Ich habe die Threads beim Entfernen des Zeilenumbruchs-Zeichens gelesen, das fgets hat, aber nichts that wassuggested worked. Gibt es etwas, das mit Microsoft Visual Studio funktionieren würde? Der beste Vorschlag war "words [strcspn (words, \ r \ n")] = 0; " und das hat die neue Zeile nicht entfernt, es sei denn, ich formatiere es falsch. Ich darf die STRTOK-Funktion nicht verwenden.C: Das Programm überspringt den nächsten Eingang

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

#define SIZE 50 
#define STOP "quit\n" 

char *copywords(char *dest, const char *source, size_t n); 

int main(void) 
{ 

    char words[50]; 
    char newwords[50]; 
    size_t num; 

    for (;;) { 

     printf("\nType a word, or type 'quit' to quit: "); 
     (fgets(words, SIZE, stdin)); 


     if (strcmp(words, STOP) == 0) { 
      printf("Good bye!\n"); 
      return 0; 
     } 

     printf("Type the # of chars to copy: "); 
     scanf_s("%d", &num); 

     copywords(newwords, words, num); 
     printf("The word was %s\n", words); 
     printf("and the copied word is %s", newwords); 


    } 
} 

char *copywords(char *dest, const char *source, size_t n) { 
    size_t i; 
    for (i = 0; i < n && source[i] != '\0'; i++) { 
     dest[i] = source[i]; 
    } 
    dest[i] = '\0'; 
    return dest; 
} 
+0

führen Sie Ihr Programm in einem Debugger (und durch Ausführen ich meine Einzelschritt) – KevinDTimm

+0

'scanf_s ("% d ", &num);' hinterlässt eine 'newline' im Eingabepuffer, die als die leere Zeichenfolge durch die nächste' gesammelt wird fgets. Bitte mischen Sie Ihre Eingabemethoden nicht: Verwenden Sie 'fgets', gefolgt von' sscanf' für den 'int', anstelle von' scanf_s ("% d", &num); '. BTW der MSVC' scanf_s' ist wirklich nicht besser als das 'scanf', ebenso leicht zu fälschen. –

+0

Auch' size_t num; '->' int num; '(weil für' scanf_s ("% d", &num); ') – BLUEPIXY

Antwort

0

Das Problem ist, dass Sie das \ n auf dem Eingang verlassen, wenn Sie scanf aufrufen. d.h. der Benutzer gibt Nummer [return] ein. Du hast die Nummer gelesen. Wenn Sie umkehren und fgets agains aufrufen, wartet die return immer noch darauf gelesen zu werden, was fgets bekommt und sofort zurückkehrt.

Ich würde wahrscheinlich nur das zweite Mal fgets aufrufen, wenn Sie die Eingabe lesen möchten, und dann sscanf verwenden, um aus der Zeichenfolge zu lesen. das heißt

printf("Type the # of chars to copy: "); 
fgets(buffer, ...) 
sscanf(buffer, "%d", ...) 

Als Neben würde ich auch Rückgabewerte zu überprüfen, sagen, wie es für fgets oder * scanf zum Scheitern verurteilt ist einfach.

0

Mein Programm überspringt den nächsten Eingang nach 1 Durchlauf.

Wenn ich Sie richtig verstanden habe, ist das Problem, dass scanf_s (was ich davon ausgehen, wie die C-Standard der scanf ist) werden die Ziffern in num lesen, aber scanf die folgende Newline von stdin nicht entfernen, und so in Die nächste Iteration der Schleife fgets wird diese Zeilenumbrüche sehen und sich so verhalten, als hätte sie eine Leerzeile gesehen. Ich habe normalerweise aus diesem Grund scanf vermieden und stattdessen eine Zeile in einen Puffer gelesen und dann analysiert. Zum Beispiel:

char buf[50]; 
... 
fgets(buf,sizeof(buf),stdin); 
sscanf(buf,"%d",&num); 

(Ich würde empfehlen, auch eine ganze Menge mehr Fehler Hinzufügen Überprüfung im gesamten Gebäude.)

0

Hier ist eine einfache Lösung.

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

#define SIZE 50 
#define STOP "quit\n" 

char *copywords(char *dest, const char *source, size_t n); 

int main(void) 
{ 

    char words[50]; 
    char newwords[50]; 
    size_t num, run = 0; 

    for (;;) { 

     printf("\nType a word, or type 'quit' to quit: "); 
     if(run) 
      getchar(); 
     (fgets(words, SIZE, stdin)); 

     if (strcmp(words, STOP) == 0) { 
      printf("Good bye!\n"); 
      return 0; 
     } 

     printf("Type the # of chars to copy: "); 
     scanf("%d", &num); 

     copywords(newwords, words, num); 
     printf("The word was %s\n", words); 
     printf("and the copied word is %s", newwords); 
     run = 1; 
    } 
} 

char *copywords(char *dest, const char *source, size_t n) { 
    size_t i; 
    for (i = 0; i < n && source[i] != '\0'; i++) { 
     dest[i] = source[i]; 
    } 
    dest[i] = '\0'; 
    return dest; 
} 

Da wir wissen, wird ein zusätzlicher sein ‚\ n‘ Charakter in dem Strom links aufgrund der scanf, es ist einfach herausgenommen.

Verwandte Themen