While循环出现Segmentation fault(core dump)问题排查求助
计算字符字母表位置时出现段错误与无限循环问题
目标
计算字符串中每个字符从字母表起始(a/A)到该字符的长度,示例:h对应长度为8(不区分大小写)。
问题现象
程序运行时触发Segmentation fault(core dump)错误。
已排查情况
- 调试发现while循环陷入无限循环,未按预期终止。
原代码
#include <cs50.h> #include <stdio.h> #include <ctype.h> #include <string.h> int main(void) { string text = get_string("Text: "); int length = strlen(text); char alpha[26]; char beta[26]; int i; for (i = 0; i <= 25; i++) { alpha[i] = 65 + i; beta[i] = 97 + i; } for (int z = 0; z <= length; z++) { while (text[z] != alpha[i] || text[z] != beta[i]) { i++; } printf("%i ", i); } }
核心问题解析
- while循环逻辑完全错误:
条件text[z] != alpha[i] || text[z] != beta[i]永远为真——任何字符不可能同时等于一个大写字母和对应的小写字母,导致i无限制递增,很快超出alpha/beta数组的下标范围(0-25),访问非法内存。 - 字符串越界访问:
外层for循环条件z <= length错误,字符串下标范围是0到length-1,当z = length时,text[z]访问的是字符串末尾的空终止符,甚至超出字符串内存区域,直接触发段错误。 - 变量未重置:
处理每个字符时,i没有重置为0,导致后续字符的查找从上次循环的i位置开始,进一步加剧越界问题。
修复方案
不需要手动构建字母数组,利用ctype.h的函数直接计算位置,代码更简洁可靠:
#include <cs50.h> #include <stdio.h> #include <ctype.h> #include <string.h> int main(void) { string text = get_string("Text: "); int length = strlen(text); for (int z = 0; z < length; z++) { char c = text[z]; if (isalpha(c)) { // 转大写后计算位置,A对应1,h对应8 int pos = toupper(c) - 'A' + 1; printf("%i ", pos); } // 非字母字符可根据需求跳过或处理 } printf("\n"); return 0; }
修复要点
- 用
toupper()统一转换为大写,通过ASCII值直接计算位置,避免手动维护字母数组的冗余操作。 - 外层循环条件改为
z < length,彻底避免字符串越界访问。 - 增加
isalpha()判断,只处理有效字母字符,避免非字母输入导致的错误。
内容的提问来源于stack exchange,提问作者Onelad
相关产品推荐
相关产品推荐

