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

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);
    }
}

核心问题解析

  1. while循环逻辑完全错误:
    条件text[z] != alpha[i] || text[z] != beta[i]永远为真——任何字符不可能同时等于一个大写字母和对应的小写字母,导致i无限制递增,很快超出alpha/beta数组的下标范围(0-25),访问非法内存。
  2. 字符串越界访问:
    外层for循环条件z <= length错误,字符串下标范围是0到length-1,当z = length时,text[z]访问的是字符串末尾的空终止符,甚至超出字符串内存区域,直接触发段错误。
  3. 变量未重置:
    处理每个字符时,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:09:12