#include <stdio.h>
#include <string.h>
void main()
{
char alfavita[30] =
{
'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
'y',
'z'
};
char str[20];
printf("Give a word:\n");
gets(str);
for(int i=0;i<strlen(str);i++)
{
for(int j=0;j<strlen(alfavita);j++)
if(alfavita[j] == str[i])
str[i] = alfavita[j+3];
}
puts(str);
}
例如,如果我给出一个&#39;它应该是回归&#39; d&#39; (每个字母将转换为alfavita数组的下一个3d)但它只是打印出一个空字符串。我找不到错误或者我没有看到它。
答案 0 :(得分:1)
str[i] = alfavita[j+3];
在这一行之后,代码继续,所以它将把i + 3,i + 6,......直到它从alfavita出来。
您可以添加break
以退出内循环,如下所示:
for(int i=0;i<strlen(str);i++)
{
for(int j=0;j<strlen(alfavita);j++)
if(alfavita[j] == str[i])
{
str[i] = alfavita[j+3];
break; // next i.
}
}
,或者只是直接访问数组:
for(int i=0;i<strlen(str);i++)
{
char c = str[i];
if (c >= 'a' && c <= 'z') {
str[i] = alfavita[(c - 'a' + 3) % strlen(alfavita)];
}
}
请注意% strlen(alfavita)
以避免在列表结尾后结束。
你也可以写下来:
if (c >= 'a' && c <= 'z') {
str[i] = ((c - 'a' + 3) % 26) + 'a';
}
答案 1 :(得分:0)
您可以使用为每个字符提供替换字符的表。
然后通过将索引计算到plain
并将该索引转移到encoded
进行编码:
char encode_char(char c)
{
const char *plain = "abcdefghijklmnopqrstuvwxyz";
const char *encoded = "defghijklmnopqrstuvwxyzabc";
const char *pp = strchr(plain, c);
if(pp != NULL)
return encoded[(ptrdiff_t) (pp - plain)];
return '?';
}
以上如何运作:
plain[0]
被编码为encoded[0]
。这可以更清楚地建模(即由具有该对的struct
建模)但随后的初始化变得更加复杂。c
字符串中搜索输入字符plain
。如果找不到,则返回NULL
,或者找到指向plain
内某处的指针。NULL
。plain
减去&plain[0]
(即a
,pp
的地址)。对a
评分为0,b
评分为1,依此类推。encoded
中查找相应的字符。?
。在便携式通用程序中,不能使用简单减法(即c - 'a'
),因为C 不保证字符以值编码彼此相邻。
正如所指出的,上面假设每个字符只编码一个char
。对于具有外来编码的目标,情况可能并非如此,在这种情况下,使用显式表格确实更安全,如下所示:
const struct {
char plain;
char encoded;
} encoding[] = {
{ 'a', 'd' },
{ 'b', 'e' },
{ 'c', 'f' },
/* ... and so on ... */
};
然后编码功能变为:
char encode_char2(char c)
{
for(size_t i = 0; i < sizeof encoding / sizeof *encoding; ++i)
{
if(encoding[i].plain == c)
return encoding[i].encoded;
}
return '?'; /* Not found. */
}