使用fgets()接收句子输入

时间:2018-10-23 00:37:41

标签: c string input

我似乎对某些代码有疑问。该代码的目的是采用一个短语并将其转换为猪拉丁语。

在我们说if(x == 1)的块中,这段代码似乎不会接受用户输入。它会做什么,它将自动将NULL用作fgets的输入,而我对此一无所知。

我在这个问题上花费了太多时间,对于如何改进此代码的任何建议,我将不胜感激。请留下评论,我将来如何改善我的问题。

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

int pigLatin()
{
    char phrase[250] = { 0 };
    char pigPhrase[300] = { 0 };
    char * tokens[300] = { 0 };
    char fileName[260] = { 0 };

    FILE * read = NULL;
    FILE * write = NULL;

    int i = 0;
    int x;
    int size;

    while (i < 10000) {
        i++;
        x = 0;
        printf("Enter one(1) to input via console, two(2) to input via .txt, or (3) to exit:\n");
        scanf_s("%d", &x);
        if (x == 1) {
            printf_s("Enter your Phrase Do not include:\nany punctuation, words less than 2 letters long, or words seperated by blanks:");

            fgets(phrase, sizeof phrase, stdin);

            phrase[strlen(phrase) - 1] = '\0';

            printf_s("\nPhrase Entered:%s\n", phrase);
            system("pause");
        }
        else if (x == 2)
        {
            printf("Enter name of input file:\n");
            scanf_s("%s", fileName, 260);
            printf("File name:\n%s\n", fileName);
            if (fopen_s(&write, fileName, "r") == 0)
            {
                scanf_s("%s", phrase, 260);

            }
        }
        else if (x == 3)
        {
            break;
        }
        else
        {
            printf("Invalid Statement\n");
            break;
        }
    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

scanf("%d", &number);将读取一个整数,但其他所有内容将保留在流中,包括在输入数字后按[Enter]生成的'\n'。然后,fgets()将使用流中剩余的换行符,而不会给您输入的机会。

使用scanf()后清除流:

int clear(FILE *stream)
{
    int ch;  // reads until EOF or a newline is encountered:
    while((ch = fgetc(stream)) != EOF && ch != '\n');
}

// ...
int number;
if(scanf("%d", &number) != 1) {
    // handle error;
}

clear(stdin);

char foo[42];
fgets(foo, sizeof(foo), stdin);

// ...