You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言字符数组转数字数组时出现死循环,求解决方案

问题排查与修复:字符数组转ASCII对应数字时的死循环与异常问题

核心错误点分析

  • 空数组导致内存越界:char b[]={};和int numero[]={};定义的是空数组,未分配有效内存。使用scanf("%s",b)写入输入时会破坏栈内存,可能覆盖循环变量、长度计数变量等,直接引发死循环或程序崩溃。
  • 循环索引逻辑错误:C语言数组从0开始索引,原代码for(i = 1; i<= string_tamanho(b); i++)跳过了第一个有效字符b[0],且当i等于字符串长度时,访问的是结束符'\0',转换后得到无意义的-96,同时numero[i]也会越界。
  • 格式与冗余问题:printf("%s ",b);的换行写法错误,应为printf("%s\n",b);;char teste();是未使用的冗余函数声明。

修复后的代码

#include <stdio.h>
#include <stdlib.h>

int string_tamanho(char b[]) {
    int conta = 0; 
    for (; b[conta] != '\0'; ++conta);
    return conta; 
}

int main(int argc, char *argv[]) {
    // 定义足够大的数组(可根据需求调整容量)
    char b[100] = {0};
    int numero[100] = {0};
    int i, len;

    // 限制输入长度,防止数组溢出
    scanf("%99s", b);
    printf("输入的字符串:%s\n", b);

    len = string_tamanho(b);
    printf("字符串长度:%i\n", len);

    // 遍历所有有效字符(从0到len-1)
    for(i = 0; i < len; i++){
        // 仅处理小写字母,避免无效字符转换错误
        if(b[i] >= 'a' && b[i] <= 'z'){
            numero[i] = b[i] - 'a' + 1; // 用字符常量代替魔法数字96,可读性更强
            printf("%i\t", numero[i]);
        } else {
            printf("无效字符:%c\t", b[i]);
        }
    }
    printf("\n");

    return 0;
}

修复说明

  • 内存分配修正:给字符数组和int数组分配固定大小的内存,避免越界;也可根据字符串长度用malloc动态分配内存。
  • 循环逻辑修正:从索引0开始遍历,循环条件改为i < len,确保覆盖所有有效字符,不会访问字符串结束符。
  • 输入安全优化:scanf("%99s", b)限制输入长度,防止超过数组容量导致溢出。
  • 可读性与健壮性提升:用'a'代替魔法数字96,添加小写字母判断逻辑,避免非目标字符转换出异常值。
  • 冗余代码清理:删除未使用的函数声明,修正printf换行格式。

内容的提问来源于stack exchange,提问作者Swampshot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:10:50