Использование fgets () для получения ввода предложения - PullRequest
0 голосов
/ 23 октября 2018

Кажется, у меня проблема с некоторым кодом.Цель кода - взять фразу и преобразовать ее в латинский.

Кажется, что этот код не будет принимать пользовательский ввод в блоке, где мы говорим, что (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 голосов
/ 23 октября 2018

scanf("%d", &number); будет читать целое число, но оставит все остальное в потоке, включая '\n', сгенерированный нажатием [Enter] после ввода числа.Эта новая строка, оставленная в потоке, затем используется 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);

// ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...