这是我的代码。它的作用不是问题。问题是,一旦它运行,我输入我的输入,如果它太小,它将在第二行再次请求输入,这似乎不影响我的程序的流程。如果我填充缓冲区(我假设100或更多),那么我不会被要求第二次提示。
#include <stdio.h>
#include <string.h>
int main()
{
int ch;
char x[3];
char *word, string1[100];
x[0]='y';
while(x[0]=='y'||x[0]=='Y')
{
fgets(string1, 100, stdin);
while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
printf("The string is: %s", string1);
word = strtok(string1, " ");
while(word != NULL)
{
printf("%s\n", word);
word = strtok(NULL, " ");
}
printf("Run Again?(y/n):");
fgets(x, 2, stdin);
while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
}
return 0;
}
编辑: 我已经更换了,
fgets(string1, 100, stdin);
while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
用,
fgets(string1, 100, stdin);
if (string1[98] != '\n' && string1[99] == '\0')
{
while ( (ch = fgetc(stdin)) != EOF && ch != '\n');
}
答案 0 :(得分:0)
您的问题的答案就在这里:man fgets
fgets()
最多从size
读取一个少于stream
个字符的字符,并将它们存储到s
指向的缓冲区中。阅读在换行符后停止 。如果读取换行符,则将其存储到缓冲区中。终止空字节( '\0'
)存储在缓冲区中的最后一个字符之后。
要知道fgets
是否使用了整个缓冲区,请将一些非NUL字节写入缓冲区的末尾。如果在调用fgets
之后,该字节已被NUL覆盖,则表示缓冲区已满。如果它前面的字符不是换行符,那么还有更多输入要读取。
buffer[size - 1] = 'a'; // any character that's not '\0'
fgets(buffer, size, stdin);
if (buffer[size - 1] == '\0' && buffer[size - 2] == '\n') {
// handle extra input
}
或者,您可以使用getchar
一次读取一个字节。
答案 1 :(得分:0)
我认为你需要这个:
注意:如果您要将x
与int
进行比较,则EOF
必须为int main()
{
int x;
char *word, string1[100];
do
{
fgets(string1, 100, stdin);
printf("The string is: %s", string1);
word = strtok(string1, " ");
while(word != NULL)
{
printf("%s\n", word);
word = strtok(NULL, " ");
}
printf("Run Again?(y/n):");
x = fgetc(stdin);
fgetc(stdin); // absorb `\n`
}
while( (x=='y'||x=='Y') && x != EOF) ;
return 0;
}
-(void)YourButtonMethod
{
YourBtn.enable = false;
}
答案 2 :(得分:0)
从手册页:
fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops
after an EOF or a newline. If a newline is read, it is stored into the buffer. A terminating null byte ('\0') is stored after the
last character in the buffer.
fgets
会将所有输入(最多99 chars
)放入string1。如果您输入98个字符并按Enter键(创建第99个\n
),则将使用全部100个,因为最后一个是\0
终止符。
然后你陷入那个小的while
循环,它只会消耗另一行输入。如果输入的字符串小于max,则在该循环等待\n
时停止输入。
如果您输入&gt; 98个字符,那么前99个字符将保存到您的输入字符串中,其余的以及最后的\n
会立即运行该while循环,导致它足够快地退出可能似乎被跳过了。
我希望有所帮助。不幸的是,我不能发表评论并要求澄清,所以我在这里说,要确定你想要修复或明确的内容有点困难。