我具有此功能,可以从用户读取文本并计算每种类型的字母数。但是,该函数不会在调用时等待用户输入。
我通常会尝试在%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;
}
答案 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;