C语言字符串数组更新异常及字符数组改造问题咨询
C字符串加密问题:重复字符异常及数组类型转换解决方案
问题原因
你的代码出现重复字符的核心问题出在textEnc的定义和赋值逻辑上:
- CS50的
string本质是char*,所以string textEnc[length]是一个指针数组,每个元素都是指向字符的指针。 - 循环里的
char asc是栈上的局部变量,它的内存地址在整个循环过程中是固定的(同一个栈帧内)。你把&asc赋值给每个textEnc[i],等于让所有指针都指向同一块内存。 - 每次循环都会覆盖
asc的值,最后所有指针都会指向最后一次循环时asc的内容,自然输出全是重复的最后一个字符。
解决方法+转为char数组的实现
要解决这个问题,同时把textEnc改成char数组(直接存储字符而非指针),步骤如下:
- 定义char数组时要预留字符串终止符
'\0'的位置,所以长度设为length + 1。 - 循环中直接将计算后的字符赋值给数组对应下标,不需要用指针。
- 循环结束后手动添加
'\0',确保是合法的C字符串。
修正后的完整代码:
#include <cs50.h> #include <stdio.h> #include <string.h> int main() { // 输入字符串和密钥 string text = get_string("String to encrypt: "); int length = strlen(text); int key = 0; do { key = get_int("Enter key [1-15]: "); } while (key < 1 || key > 15); // 定义char数组,预留终止符位置 char textEnc[length + 1]; for (int i = 0; i < length; i++) { // 直接计算后赋值给数组元素 textEnc[i] = text[i] - key; } // 添加字符串终止符,必须! textEnc[length] = '\0'; // 测试输出加密后的字符串 printf("Encrypted string: %s\n", textEnc); return 0; }
额外注意点
- 字符ASCII值减去key后可能会变成不可打印字符(比如小写字母减key可能落到控制字符区间),如果需要保持可打印,可以考虑取模处理(比如类似凯撒密码的逻辑,确保落在字母范围内)。
- 如果要动态分配内存(而非栈上数组),可以用
malloc(length + 1),记得最后用free()释放内存。
内容的提问来源于stack exchange,提问作者donut183
相关产品推荐
相关产品推荐

