我似乎对某些代码有疑问。该代码的目的是采用一个短语并将其转换为猪拉丁语。
在我们说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;
}
答案 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);
// ...