将scanf和EOF添加到程序中

时间:2014-10-27 19:02:16

标签: c scanf eof

#include <stdio.h>
#include <string.h>

int main()
{
   char string[100];
   int c = 0, count[26] = {0};
   int accum = 0;

   printf("Enter a string\n");
   gets(string);

   while ( string[c] != '\0' )
   {

      if ( string[c] >= 'a' && string[c] <= 'z' ){
         count[string[c]-'a']++;
         accum++;
      }

      else if (string[c] >= 'A' && string[c] <= 'Z'){
          count[string[c]-'A']++;
          accum++;
      }
      c++;
   }

   for ( c = 0 ; c < 26 ; c++ )
   {
      if( count[c] != 0 )
          printf( "%c %f\n", c+'a', ((double)count[c])/accum);
   }

   return 0;
}

这应该是一个简单的问题,但我似乎无法让它发挥作用。现在,我有print语句&#34;输入字符串&#34;。我想更改它,以便用户可以使用scanf而不是printf继续输入字符串,直到达到EOF。基本上我想删除&#34;输入字符串&#34;声明,只需输入一个字符串直到EOF,然后在所有输入的字符串上运行一次字母频率。我该怎么做?

3 个答案:

答案 0 :(得分:1)

使用scanf()进行输入。

发生EOF条件或IO错误时,

scanf()返回EOF。

 // printf("Enter a string\n");
 char ch;
 while (scanf("%c", &ch) == 1) {  
   if ( ch >= 'a' && ch <= 'z' ){
     count[ch-'a']++;
     accum++;
   }
   ...
 }

使用int ch = fgetc(stdin)会更有意义。


  

“如果发生输入故障,fscanf函数将返回宏EOF的值   在第一次转换(如果有)之前完成。否则,该函数返回   分配的输入项目数量,可以少于提供的数量,甚至为零   早期匹配失败的事件。“C11dr§7.21.6.216

答案 1 :(得分:0)

在while循环中添加你的printf和gets语句

printf("Enter a string\n");
gets(string);

while ( string[c] != '\0' )
{
     ...//remaining code inside while loop

     printf("Enter a string\n");
     gets(string);

}
... //for loop code and return 0;

答案 2 :(得分:0)

你走了。我将每个循环的变量归零。我处理了一个空白条目(只需按Enter键)作为EOF。但是如果您想要所有字符串的统计信息,请不要将while循环开头的值归零

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{
    char string[100];
    int c = 0, count[26] = {0};
    int accum = 0;

    do {
        c = 0;
        accum = 0;
        memset (count, sizeof count, 0);

        gets(string);
        if (strlen (string) < 1)
            break;      // terminate

        while ( string[c] != '\0' ) {
            if ( string[c] >= 'a' && string[c] <= 'z' ) {
                count[string[c]-'a']++;
                accum++;
                }

            else if (string[c] >= 'A' && string[c] <= 'Z') {
                count[string[c]-'A']++;
                accum++;
                }
            c++;
            }

        for ( c = 0 ; c < 26 ; c++ ) {
            if( count[c] != 0 )
                printf( "%c %f\n", c+'a', ((double)count[c])/accum);
            }
        }
    while (1);

    return 0;
}