#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,然后在所有输入的字符串上运行一次字母频率。我该怎么做?
答案 0 :(得分:1)
使用scanf()
进行输入。
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;
}