我在 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。我哪里错了?
这就是scanf
与gets
/混合时发生的情况fgets
。
呼叫到scanf
正在等待一个号码。当您输入“1wjhue73b38409598”作为输入时,它会读取字符串开头的 1,并在看到“w”时停止读取。所以n
设置为1。
然后gets
立即读取剩余的字符(即“wjhue73b38409598”)而不提示。由于 1 不是此字符串的一部分,因此不会被计算在内。
然而,还有另一个问题。因为n
设置为1,str
只能容纳1个字符。所以gets
调用写入超过缓冲区的末尾。这会调用未定义的行为。在这种特殊情况下,事情似乎可以正常工作,但是对代码的微小更改可能会改变未定义行为的表现方式。
即使您要输入适当的值,n
例如 50,scanf
调用也会在缓冲区中留下一个换行符。随后对gets
then 的调用立即读取换行符并停止,因此所有计数器均为 0。
改用固定大小的缓冲区并使用fgets
,它可以被赋予最大读取大小,以读取字符串:
char str[50];
fgets(str, sizeof(str), stdin);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句