【问题标题】:Given a string consisting of alphabets and digits, find the frequency of each digit in the given string给定一个由字母和数字组成的字符串,找出给定字符串中每个数字出现的频率
【发布时间】:2019-11-04 23:45:27
【问题描述】:

请告诉我输出是 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;
}

【问题讨论】:

    标签: c frequency digits


    【解决方案1】:

    首先,您将一个字符与一个 int 进行比较。查看Char to int conversion in C 以获得解决方案。

    那么,我会记得“0”是 ASCII 表中的索引 48,而不是 0:http://www.asciitable.com/

    【讨论】:

    • 我不会费心使用值48。所有现实世界的字符集(包括标准主题的字符集)都具有以0 开头并增加的连续集中的数字。因此,从任何数字中减去 '0' 都会提取等价的数字('0' - '0' - > 0'1' - '0' -> 1,....'9' - '0' -> 9)。
    • 这也是符合 C 标准的执行字符集的要求。
    【解决方案2】:

    关键问题是s[j]==i。这会将字符串的 char 与值 0 到 9 进行比较,而不是 char '0''9'

    另一个是c 不会在每个循环中重置为零。


    不要循环 10 次,而是测试 char 是否为数字。

    不要重复调用j&lt;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 作为字符串 的长度限制为size_t - 在极端情况下可能超过int。要么工作正常,工作大小 100。

    isdigit()&lt;ctype.h&gt; 中声明

    (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 中,string 包括最后的 null 字符:“string 是由第一个 null 字符终止并包括第一个 null 字符的连续字符序列” C11 §7.1.1 1. 然而,人们经常口语化,因为 null 字符 不是字符串的一部分。

    【讨论】:

    • 循环的另一种样式选择:for (char *t = s; *t; ++t)。然后在循环体中使用s[i]的地方使用*t
    【解决方案3】:

    您在“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;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-04-30
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多