C - 提示第二次输入,什么都不做

时间:2015-09-16 12:41:57

标签: c input buffer stdin fgets

这是我的代码。它的作用不是问题。问题是,一旦它运行,我输入我的输入,如果它太小,它将在第二行再次请求输入,这似乎不影响我的程序的流程。如果我填充缓冲区(我假设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'); 
 }

3 个答案:

答案 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)

我认为你需要这个:

注意:如果您要将xint进行比较,则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循环,导致它足够快地退出可能似乎被跳过了。

我希望有所帮助。不幸的是,我不能发表评论并要求澄清,所以我在这里说,要确定你想要修复或明确的内容有点困难。