请告诉我代码出了什么问题,输出为00000000。
我知道有一些错误,但是找不到。
#include <stdio.h>
#include <string.h>
int main()
{
int c=0;
char s[100];
fgets(s, 100, stdin);
printf("%s", s);
for(int i=0;i<=9;i++)
{
for(int j=0;j<strlen(s);j++)
{
if(s[j]==i){
c++;
}
}
printf("%d", c);
}
return 0;
}
答案 0 :(得分:1)
首先,您正在将一个字符与一个int进行比较。看一下Char to int conversion in C以获得解决方案。
然后,我会记得您“ 0”是ASCII表中的索引48,而不是0:http://www.asciitable.com/
答案 1 :(得分:0)
关键问题是s[j]==i
。这会将字符串的char
与值0到9进行比较,而不是char
与'0'
到'9'
。
另一个是c
不会在每个循环中都重置为零。
测试char
是否为数字,而不是循环10次。
而不是反复调用j<strlen(s)
,只需测试s[j] == 0
size_t digit_frequency[10] = {0};
for (size_t i=0; s[i]; i++) {
if (isdigit((unsigned char) s[i])) {
// or if (s[i] >= '0' && s[i] <= '9') {
digit_frequency[s[i] - '0']++;
}
}
for (size_t i=0; i<10; i++) {
pritnf("%zu\n", s[i]);
}
代码使用size_t
而不是int
作为 string 的长度限制为size_t
-在极端情况下可能超过int
。两种都可以,工作尺寸为100。
isdigit()
中声明的 <ctype.h>
(unsigned char)
用作isdigit()
,期望(unsigned char)
和EOF
中的值以及char
可能为负。
各种样式选择-所有功能都相同。
for (size_t i=0; s[i]; i++) {
for (size_t i=0; s[i] != '\0'; i++) {
for (size_t i=0; s[i] != 0; i++) {
“给出由字母和数字组成的字符串”是次要的缩写。在C语言中,字符串包含最后的 null字符:“ A string 是连续的字符序列,以第一个空字符结尾并包括它们” C11§7.1.11.然而,人们经常以口语说话,因为空字符不是字符串的一部分。
答案 2 :(得分:0)
您在“if(s[j]==i)”这一行做错了,并且您没有创建任何单独的数组来存储数字频率,如果您使用单个变量进行频率计数,那么它将显示字符串频率的累积
你可以拿is代码作为参考
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *s;
s = malloc(1024 * sizeof(char));
scanf("%s", s);
s = realloc(s, strlen(s) + 1);
int len = strlen(s), i;
int arr[10];
for(i = 0; i < 10; i++)
arr[i] = 0;
for(i = 0; i < len; i++) {
if(s[i] >= '0' && s[i] <= '9') {
arr[(int)(s[i] - '0')]++;
}
}
for(i = 0; i < 10; i++)
printf("%d ", arr[i]);
printf("\n");
free(s);
return 0;
}