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

