程序不等待文本输入

时间:2019-04-16 05:40:43

标签: c

我具有此功能,可以从用户读取文本并计算每种类型的字母数。但是,该函数不会在调用时等待用户输入。

我通常会尝试在%c之前放置一个空格,但是添加此空格会使它消失,因此在您按Enter键后程序不会继续执行。

 void ReadText(int histo[], int *max) {

    int i;
     char userInput;

    printf("ENTER A LINE OF TEXT:\n");
    do{

    if (scanf("%c", &userInput) != 1)
    break;

  if(userInput >= 97 && userInput <= 122)
     histo[userInput-97] = histo[userInput-97] + 1;
  else if(userInput >= 65 && userInput <= 90)
     histo[userInput-65] = histo[userInput-65] + 1;

  }while(userInput != '\n');

  for(i = 0; i < 26; i++)
  printf("%d ", histo[i]);

    *max = histo[0];

   for(i = 0; i < 25; i++)
      if(histo[i] > *max)
         *max = histo[i];
}





int main() {   

   char command;
   int i, max;
   int histo[26] = {0};

   //User Input Validation

   do{

   printf("Enter command (C, R, P, or Q): ");
   scanf(" %c", &command);

   switch(command) {

  case 'C': case 'c':
     for(i = 0; i < 25; i++)
        histo[i] = 0;
     break;            

  case 'R': case 'r':    
     ReadText(histo, &max);
     break;

  case 'P': case 'p':      
     DrawHist(histo, max);
     break;

  case 'Q': case 'q':
     return 0;

  default:

     printf("Invalid Command %c", command);
     printf("\n");      
  }
   }while(1);

   return 0;
}

3 个答案:

答案 0 :(得分:1)

当我第一次编写此答案时,未提供main()程序。现在提供了它,主要的问题是scanf() leaves the newline in the input buffer。当主程序读取r(或R)时,其后的换行符将保留在缓冲区中。 ReadText()中的代码立即读取换行符,仅此而已。

" %c"的{​​{1}}中添加空格意味着在处理空格时,并且仅当非白色的东西时,将读取所有空白,制表符和换行符输入空格将终止输入。对于此处的代码,仅使用ReadText()是正确且必要的(除非您决定改用"%c")。您也应该处理EOF。在getchar()中,您应检查:

ReadText()

最好的解决方法可能是使用类似以下的功能

if (scanf("%c", &userInput) != 1)
    break;

并在static void gobble(void) { int c; while ((c = getchar()) != EOF && c != '\n') ; } 之后的main()中调用它以读取命令字符:

printf(“输入命令(C,R,P或Q):”);    如果(scanf(“%c”,&command)!= 1)        返回0; // EOF最有可能    gobble();

此处的scanf()(在" %c"中)是明智的。在main()中不合适。

请记住:ReadText()可能是在标准C中真正难以使用的最困难的函数-它异常复杂和微妙,任何给定的调用通常都受先前输入操作的影响,尤其是先前对{{1}的调用}。除非使用scanf()之类的功能清除行上任何未读的残留物,否则输入错误后的恢复也相当困难-但是对错误的诊断也很困难。通常最好先使用scanf()(或POSIX gobble())读取该行,然后使用fgets()对其进行扫描,这样您可以(a)多次尝试解析相同的数据,和(b)允许您报告整个故障行,而不是报告getline()读取了部分但不是全部行之后剩下的片段。

答案 1 :(得分:1)

问题出在您的主函数中-您调用scanf(" %c"来读取命令,该命令会将换行符留在输入缓冲区之后。因此,当您调用ReadText时,它首先读取的是换行符,它会立即返回。

在调用ReadText之前,您需要添加一些代码以读取(并丢弃)当前输入行的其余部分。

答案 2 :(得分:0)

在主要添加的作品中,如魅力,感谢会说话的人!

  case 'R': case 'r':   
     while((c = getchar()) != '\n' && c != EOF); //Clear the newlines
     ReadText(histo, &max);
     break;