我在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。我哪里错了?
发布于 2018-10-17 02:48:02
这就是当您将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);
https://stackoverflow.com/questions/52841941
复制相似问题