我在C语言中查找字符数组中数字频率的代码没有提供所需的输出。
int main() {
int n;
scanf("%d",&n);
char str[n];
int f[10],i,j,ns;
gets(str);
for(i=0;i<10;i++)
{
f[i]=0;
for(j=0;j<strlen(str);j++)
{
ns=str[j]-'0';
if(i==ns)
f[i]+=1;
}
}
for(i=0;i<10;i++)
printf("%d ",f[i]);
return 0;
}
如果我输入字符串
1wjhue73b38409598
我得到的频率为(0-9):
1 0 0 2 1 1 0 1 2 2
代替“ 1”的频率1。 我要去哪里错了?
答案 0 :(得分:5)
当您将scanf
与gets
/ fgets
混合使用时,会发生这种情况。
打给scanf
的电话正在等待一个号码。当您输入“ 1wjhue73b38409598”作为输入时,它将在字符串的开头读取1,并在看到“ w”时停止读取。因此n
设置为1。
然后gets
会立即读取其余字符(即“ wjhue73b38409598”),而不会提示。由于1不是该字符串的一部分,因此不会计数。
但是,还有另一个问题。因为n
设置为1,所以str
只能容纳1个字符。因此gets
调用将写入缓冲区的末尾。这将调用undefined behavior。在这种特殊情况下,事情似乎可以正常工作,但是对代码的微小改动可能会改变未定义行为的表现方式。
即使您要为n
输入适当的值(例如50),scanf
调用也会在缓冲区中保留换行符。随后对gets
的调用立即读取换行符并停止,因此所有计数器均为0。
请改用固定大小的缓冲区,并使用fgets
(可以指定最大读取大小)来读取字符串:
char str[50];
fgets(str, sizeof(str), stdin);