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

C语言字符串数组更新异常及字符数组改造问题咨询

C字符串加密问题:重复字符异常及数组类型转换解决方案

问题原因

你的代码出现重复字符的核心问题出在textEnc的定义和赋值逻辑上:

  • CS50的string本质是char*,所以string textEnc[length]是一个指针数组,每个元素都是指向字符的指针。
  • 循环里的char asc是栈上的局部变量,它的内存地址在整个循环过程中是固定的(同一个栈帧内)。你把&asc赋值给每个textEnc[i],等于让所有指针都指向同一块内存。
  • 每次循环都会覆盖asc的值,最后所有指针都会指向最后一次循环时asc的内容,自然输出全是重复的最后一个字符。

解决方法+转为char数组的实现

要解决这个问题,同时把textEnc改成char数组(直接存储字符而非指针),步骤如下:

  1. 定义char数组时要预留字符串终止符'\0'的位置,所以长度设为length + 1。
  2. 循环中直接将计算后的字符赋值给数组对应下标,不需要用指针。
  3. 循环结束后手动添加'\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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:32:28