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
相关产品推荐
相关产品推荐

