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
相关产品推荐
相关产品推荐

