给定一个由字母和数字组成的字符串,找到给定字符串中每个数字的频率

时间:2019-06-22 11:22:30

标签: c frequency digits

请告诉我代码出了什么问题,输出为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;
}

3 个答案:

答案 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;
}