C语言凯撒密码实现中如何将加密字符拼接为完整字符串输出
问题原因
你当前出现单字符逐行输出的问题有两个直接诱因:
- 你在打印单字符的
printf语句末尾加了\n换行符,每打印一个字符就会自动换行 - 你把
cyphertext:前缀的打印逻辑写在了字符处理循环内部,每次处理单个字符都会重复打印前缀
解决方法
方法1:调整打印逻辑(无需拼接字符串,最简单实现)
不需要额外存储完整字符串,只需要调整打印的位置和格式即可:
- 循环处理字符前,先单独打印一次
cyphertext:前缀 - 循环内部处理完单个字符后,只打印字符本身,不追加换行符
- 所有字符处理完毕后,统一打印一次换行符
参考代码片段:
// 循环外先打印前缀 printf("cyphertext: "); for (int i = 0; user_input[i] != '\0'; i++) { char encipher; if (isupper(user_input[i])) { int alphabet_index = user_input[i] - 'A'; int calculate_value = (alphabet_index + key) % 26; encipher = calculate_value + 'A'; } else if (islower(user_input[i])) { // 补充小写字母处理逻辑 int alphabet_index = user_input[i] - 'a'; int calculate_value = (alphabet_index + key) % 26; encipher = calculate_value + 'a'; } else { // 非字母字符(空格、逗号等)直接保留 encipher = user_input[i]; } // 只打印字符,不加换行 printf("%c", encipher); } // 全部处理完再换行 printf("\n");
方法2:拼接为完整字符串后统一打印
如果需要后续使用完整的密文字符串,可以提前申请缓冲区存储:
- 声明一个长度和输入字符串一致+1的字符数组作为密文缓冲区,多出来的1位用来存储C语言字符串必须的结束符
\0 - 循环处理时把每个加密后的字符赋值到缓冲区对应下标位置
- 循环结束后给缓冲区最后一位赋值
\0,再一次性打印整个字符串
参考代码片段:
int len = strlen(user_input); // 申请缓冲区,多留1位存结束符 char cipher_result[len + 1]; for (int i = 0; i < len; i++) { if (isupper(user_input[i])) { int alphabet_index = user_input[i] - 'A'; int calculate_value = (alphabet_index + key) % 26; cipher_result[i] = calculate_value + 'A'; } else if (islower(user_input[i])) { int alphabet_index = user_input[i] - 'a'; int calculate_value = (alphabet_index + key) % 26; cipher_result[i] = calculate_value + 'a'; } else { cipher_result[i] = user_input[i]; } } // 补充字符串结束符 cipher_result[len] = '\0'; // 一次性打印完整密文 printf("cyphertext: %s\n", cipher_result);
注:你需求里
hello, world转uryyb, jbeyq是密钥为13的ROT13加密,对应上述代码里key=13即可实现对应效果。
内容的提问来源于stack exchange,提问作者Ezimo Prince
相关产品推荐
相关产品推荐

