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

CS50替换密码程序报错:输出非有效ASCII文本求助

CS50替换密码代码问题排查

你的代码核心问题出在大写明文的加密处理逻辑上:当明文是大写字母时,你直接输出密钥中对应位置的原字符,但没有将其转换为大写,导致密文的大小写与预期不符。CS50检查工具的错误提示“输出非有效ASCII文本”实际是因为输出结果与预期的大小写不匹配,而非真的存在非ASCII字符。

具体来说,测试用例中明文的大写字母(如T)需要转换为密钥对应位置字符的大写形式,但你的代码直接输出密钥中的小写字符,导致结果不符合要求。

另外,代码中单独处理空格的分支是多余的,因为else分支已经会直接输出原字符(包括空格),可以删除以简化代码。

修改点

  • 处理大写明文时,使用toupper()将密钥对应字符转换为大写后输出
  • 删除多余的空格判断分支
  • 提前计算字符串长度并存储,避免循环中重复调用strlen提升效率

修改后的代码

#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(int argc, string argv[])
{
    if (argc != 2)
    {
        printf("Usage: ./substitution key\n");
        return 1;
    }

    string key = argv[1];
    int key_len = strlen(key);

    if (key_len != 26)
    {
        printf("Usage: ./substitution key\n");
        printf("The key must contain 26 characters\n");
        return 1;
    }

    for(int i = 0; i < key_len; i++)
    {
        if (!isalpha(key[i]))
        {
            printf("Usage: ./substitution key\n");
            return 1;
        }
    }

    for (int i = 0; i < key_len; i++)
    {
        for(int j = i + 1; j < key_len; j++)
        {
            if (toupper(key[i]) == toupper(key[j]))
            {
                printf("Usage: ./substitution key\n");
                return 1;
            }
        }
    }

    string plaintext = get_string("Plaintext: ");
    int text_len = strlen(plaintext);

    printf("ciphertext: ");

    for(int i = 0; i < text_len; i++)
    {
        if(isupper(plaintext[i]))
        {
            int letter = plaintext[i] - 'A';
            printf("%c", toupper(key[letter])); // 转换为大写输出
        }
        else if(islower(plaintext[i]))
        {
            int letter = plaintext[i] - 'a';
            printf("%c", tolower(key[letter]));
        }
        else
        {
            printf("%c", plaintext[i]); // 直接输出非字母字符,包括空格
        }
    }
    printf("\n");
    return 0;
}

内容的提问来源于stack exchange,提问作者iShareInspiration

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:25:21