【发布时间】:2022-01-04 02:18:39
【问题描述】:
任务是让用户插入一个字符串,程序将输出一条秘密消息,该消息将该字符串中的每个字符更改为另一个字符。将插入的新字符列表由排列“qjczieaungsdfxmphybklortvw”给出,它对应于字母表的每个字母。例如,字符串“abcxyz”将返回“qjctvw”。程序会忽略符号和大写字母,所以“Abc”会变成“Ajc”。
我试图通过将字符串的每个位置与字母表中的每个字母进行比较来实现这一点。如果匹配,则字符串的该位置将被与传统字母表位置相同的秘密排列位置替换(因为它们对应)。该代码在技术上有效,但我没有得到正确的值。例如,对于每个“a”,我应该得到一个“q”,但返回的是一个“h”。如果有人能修复我的代码,将不胜感激。
下面的代码:请复制并粘贴到您喜欢的代码编辑器中,看看我返回错误值的意思。
#include <string.h>
#define MAX_STR_LEN 256
int main(void)
{
char perm[] = "qjczieaungsdfxmphybklortvw";
char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
int i, j;
char msg[MAX_STR_LEN+1];
/* read the message from the terminal using fgets. The variable msg will contain the message. */
fgets(msg, MAX_STR_LEN, stdin);
/*compares each value of the string to the alphabet*/
for (i = 0; i < (strlen(msg) - 1); i++) {
for (j = 0; j < (strlen(alphabet) - 1); j++) {
if (msg[i] == alphabet[j]) {msg[i] = perm[j];}
}
}
printf("%s", msg);
}
【问题讨论】:
-
有一种更简单的方法来进行替换。将内部循环替换为:
msg[i] = perm[msg[i] - 'a'];。也就是说,将每个输入字母变基以将索引直接放入perm。处理大写字母、意外输入和其他错误情况留作练习。 -
如果你想让你的版本正常工作,那么你需要在
if块内添加一个break。否则它将继续尝试替换已经替换的字母。
标签: c char c-strings fgets substitution