C语言实现替换密码时修改lowkey导致upkey同步变更的问题排查
问题原因与解决方案:C语言中字符串赋值导致同步修改的问题
这问题我太熟了!你遇到的核心问题是没搞懂C语言(尤其是CS50的string类型)中字符串的内存指向逻辑,咱们一步步拆解清楚:
为什么修改lowkey时upkey也会同步变化?
首先要明确:CS50里的string本质是char*(字符指针)的别名。当你写:
string lowkey = upkey;
这行代码并没有复制upkey指向的字符串内容,而是让lowkey这个指针也指向了upkey所指向的同一块内存地址——也就是命令行输入的argv[1]那块内存空间。
简单说,upkey和lowkey现在是“两个指针,盯着同一个箱子”。你通过lowkey[i]修改箱子里的内容,upkey去看这个箱子时,内容自然也变了。这就是循环里每改一个字符,两个字符串都会同步变化的原因。
怎么解决这个问题?
你需要为lowkey单独分配一块新的内存空间,把upkey的内容复制过去,再修改新内存里的内容。这里有两种常用方法:
方法1:用strdup快速复制字符串(推荐)
strdup函数会自动为新字符串分配足够的内存(包括末尾的\0终止符),并把原字符串的内容复制进去。记得包含<stdlib.h>头文件,用完后要释放内存:
#include <cs50.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> // 用于tolower() int main(int argc, string argv[]) { // 省略密钥合法性校验逻辑 string upkey = argv[1]; // 复制upkey到新内存,生成lowkey的初始值 string lowkey = strdup(upkey); if (lowkey == NULL) { // 检查内存分配是否成功 printf("Memory allocation failed\n"); return 1; } // 生成小写密钥 for (int i = 0, n = strlen(upkey); i < n; i++) { // 用tolower()比直接+32更安全,适配不同字符集 lowkey[i] = tolower(upkey[i]); } // 测试输出 printf("Original upkey: %s\n", upkey); printf("Generated lowkey: %s\n", lowkey); free(lowkey); // 释放strdup分配的内存,避免内存泄漏 return 0; }
方法2:手动malloc+strcpy
如果你想更清晰地控制内存分配,可以手动用malloc申请内存,再用strcpy复制内容:
// 替换strdup的部分: string lowkey = malloc(strlen(upkey) + 1); // +1是为了存储字符串终止符'\0' if (lowkey == NULL) { printf("Memory allocation failed\n"); return 1; } strcpy(lowkey, upkey); // 复制upkey的内容到lowkey的新内存
额外优化建议
- 不要直接用
+32转小写,而是用<ctype.h>里的tolower()函数,它能兼容不同的字符编码规范,更安全可靠。 - 记得在使用完
malloc或strdup分配的内存后,用free()释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Andrea De Arcangelis
相关产品推荐
相关产品推荐

