C语言运行时错误:字符串转大写for循环致程序无输出
CS50加密作业字符串操作异常排查
问题现象
使用CS50头文件的string类型编写加密作业代码,编译通过但无法完整执行,退出状态为False。定位到以下代码段后发现,执行这段代码后无任何输出,甚至后续的printf("Hello")也不会执行:
string key = "YTNSHKVEFXRBAUQZCLWDMIPGJO"; for (int i = 0; i < 25; i++) { key[i] = toupper(key[i]); } printf("%s", key); printf("Hello");
问题根源
CS50的string本质是char*的别名。当你用string key = "YTNSHKVEFXRBAUQZCLWDMIPGJO";赋值时,key指向的是只读存储区中的字符串字面量。C语言中不允许修改字符串字面量,强行赋值(比如key[i] = toupper(key[i]);)会触发未定义行为,直接导致程序崩溃或异常终止,因此后续代码根本没有执行机会。
另外,原循环条件i < 25存在小问题:目标字符串实际包含26个字母,这个条件会漏掉最后一个字符,但这不是程序崩溃的核心原因。
解决方案
要解决这个问题,需要让key指向可修改的内存区域,有两种常用方式:
方式1:使用可修改的字符数组
直接将字符串初始化为栈上的字符数组,数组内容可自由修改:
#include <cs50.h> #include <stdio.h> #include <ctype.h> #include <string.h> int main(void) { // 用char数组存储字符串,栈上内存可修改 char key[] = "YTNSHKVEFXRBAUQZCLWDMIPGJO"; int key_len = strlen(key); for (int i = 0; i < key_len; i++) { key[i] = toupper(key[i]); } printf("%s\n", key); printf("Hello\n"); return 0; }
方式2:动态分配可修改内存
通过malloc分配堆内存,将字符串字面量复制到该区域后再修改:
#include <cs50.h> #include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> int main(void) { const char* original_key = "YTNSHKVEFXRBAUQZCLWDMIPGJO"; // 分配足够存储字符串加终止符的内存 string key = malloc(strlen(original_key) + 1); // 检查内存分配是否成功 if (key == NULL) { fprintf(stderr, "内存分配失败\n"); return 1; } strcpy(key, original_key); int key_len = strlen(key); for (int i = 0; i < key_len; i++) { key[i] = toupper(key[i]); } printf("%s\n", key); printf("Hello\n"); // 释放动态分配的内存 free(key); return 0; }
两种方式都能避免修改只读内存的问题,确保程序正常执行并输出结果。
内容的提问来源于stack exchange,提问作者TheThinker0x4D2
相关产品推荐
相关产品推荐

