首页 > 解决方案 > 即使是 300 个字符输入,代码也无法正确运行

问题描述

这是用于查找字符串输入中数字频率的代码。它是 char 数组,就像 c 一样。但是当我尝试大输入时它正在下降。

我知道在将 char 转换为 int 时可能有问题,但我不明白究竟是什么。我知道完全解决这个问题的不同方法,但我只想知道这段代码有什么问题,因为它看起来很好伊格。

int main() {

    char a[1001];
    scanf("%s",a);
    int arr[10];
    for(int i=48;i<=57;i++){
       arr[i]=0;
    }
    int count=0,j=0;
    while(j<strlen(a)){
      //printf("%c",a[j]);
      if(a[j]>='0' && a[j]<='9'){
        arr[a[j]]++;
      }
      j++;
    }
    //printf("\n");
    for(int i=48;i<=57;i++){
       printf("%d ",arr[i]);
    }
    //printf("\n%d",count);
    return 0;
}

示例输入,例如:-->

EXPECTED OUTPUT:-->56 58 43 37 40 43 47 39 37 48

my code output:-->10 11 10 13 7 12 5 7 12 12

标签: c

解决方案


您需要将保存结果的数组与数字的 ASCII 值分开 - 它们不相关。由于for(int i=48;i<=57;i++)写入超出数组范围,因此忘记使用 ASCII 值。您可以使用简单的int arr[10] = {0};.

同样,您可以通过执行将 ASCII 格式的数字转换为整数值a[i] - '0'

这意味着您的循环可以简化并简化为:

int arr[10] = {0};
int length = strlen(a);
for(int i=0; i<length; i++)
{
  if(a[i]>='0' && a[i]<='9')
  {
    int val = a[i] - '0';
    arr[val]++;
  }
}

该检查a[i]>='0' && a[i]<='9'又可以用isdigit(a[i])ctype.h 中的 ,​​ 替换。


推荐阅读