C - 提示输入第二个输入但什么都不做

C - Prompted for a second input and does nothing

下面是我的代码。它做什么不是问题。问题是,一旦它是 运行,我输入我的输入,如果它太小,它会在第二行再次要求输入,这似乎不会影响我的程序流程。如果我填充缓冲区(我假设 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] == '[=12=]') 
 { 
   while ( (ch = fgetc(stdin)) != EOF && ch != '\n'); 
 }

您的问题的答案就在这里:man fgets

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 ('[=16=]') is stored after the last character in the buffer.

要知道 fgets 是否使用了整个缓冲区,请将一些非 NUL 字节写入缓冲区的末尾。如果在调用 fgets 之后,该字节已被 NUL 覆盖,则表示缓冲区已满。如果它之前的字符不是换行符,那么还有更多的输入需要读取。

buffer[size - 1] = 'a'; // any character that's not '[=10=]'
fgets(buffer, size, stdin);
if (buffer[size - 1] == '[=10=]' && buffer[size - 2] == '\n') {
    // handle extra input
}

或者,您可以使用 getchar.

一次读取一个字节

我想你需要这个:

注意:如果要与 EOF

进行比较,x 必须是 int
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;
}

来自手册页:

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 ('[=10=]') is stored after the
   last character in the buffer.

fgets 会将所有输入(最多 99 chars)放入 string1。如果您输入 98 个字符并按回车键(创建第 99 个 \n),那么所有 100 个字符都将被使用,因为最后一个字符是 [=14=] 终止符。

然后你会陷入那个 while 小循环,这个循环除了消耗另一行输入外什么都不做。如果您输入的字符串小于最大值,则在该循环等待 \n.

时停止输入

如果您输入 >98 个字符,那么前 99 个字符将保存到您的输入字符串中,其余的 \n 将立即 运行 通过 while 循环,从而使其退出速度足够快,以至于它似乎被跳过了。

希望对您有所帮助。不幸的是,我无法发表评论并要求澄清,所以我会在这里说,很难说出你到底想要修复或澄清什么。