我编写了一个C程序来计算输入字符的出现次数。当我执行时,我只能输入文件名。在输入要计数的字符之前,下一个语句会执行。我得到的输出如下所示。
Enter the file name test.txt Enter the character to be counted File test.txt has 0 instances of
这是我的代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp1;
int cnt=0;
char a,ch,name[20];
printf("Enter the file name\n");
scanf("%s",name);
//fp1=fopen(name,"r");
printf("Enter the character to be counted\n");
scanf("%c",&ch);
fp1=fopen(name,"r");
while(1)
{
a=fgetc(fp1);
if (a==ch)
cnt=cnt+1;
if(a==EOF)
break;
}
fclose(fp1);
printf("File %s has %d instances of %c",name,cnt,ch);
return 0;
}
如何解决这个问题?
答案 0 :(得分:5)
这是一个常见的初学者问题,尤其是在使用scanf
系列函数时。
问题是,当您输入文件名,然后按 Enter 时,scanf
函数会读取文本但保留 Enter 键, newline,在输入缓冲区中,所以当你下次读取一个字符时,它会读取该换行符。
解决方案非常简单:通过以scanf
格式放置一个空格,告诉scanf
读取并丢弃任何前导空格:
scanf(" %c",&ch);
// ^
// |
// Note leading space
如果您点击scanf
reference的链接,它会告诉您几乎所有格式都会自动读取并丢弃前导空格,三个例外中的一个只是读取单个字符的格式{{1} }。