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

C语言大小写转换代码触发段错误 疑似与CS50库string类型有关

问题原因

  • CS50库里的string本质就是char *的别名,没有额外的特殊处理。
  • 代码里string alphabet = "a"的赋值操作,是让alphabet指针指向了存储在只读数据段的字符串字面值,操作系统禁止程序修改该内存区域的内容,写入操作会直接触发段错误。
  • 第一个if语句没有触发报错的原因是条件永远不成立:key的值为"B",第一个字符是大写,islower(key[i])返回假,逻辑与运算短路,不会执行修改alphabet的代码,自然不会触发异常。第二个if语句的条件完全匹配当前变量取值,会执行写入只读内存的操作,所以每次都会触发段错误,和CS50库本身的实现无关。

可行替代方案

不要将需要修改的字符串直接赋值为字符串字面值,改用可写的字符数组存储即可,修改示例如下:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <cs50.h>

int main(void)
{
    int i;
    string key = "B";
    // 改为字符数组定义,内容会拷贝到栈上的可写内存
    char alphabet[] = "a";

    for (i = 0; i < strlen(key); i++)
    {
        if (islower(key[i]) && isupper(alphabet[i]))
        {
            alphabet[i] = tolower(alphabet[i]);
        }
    }

    for (i = 0; i < strlen(key); i++)
    {
        if (isupper(key[i]) && islower(alphabet[i]))
        {
            alphabet[i] = toupper(alphabet[i]);
        }
        printf("yeet");
    }
}

如果需要动态长度的可写字符串,也可以用malloc申请堆空间后拷贝字符串内容,用完记得free释放即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:57:05