我尝试在C中编写一个函数,它将以相反的顺序映射字母。例如,字母'a'将被字母'z'或'B'替换为'Y'(区分大小写)。它不会转换标点符号和空格。
我写了代码的主要部分,但我找不到后向字母表的算法或公式。
编辑:这是我的工作;
void backward_alphabet()
{
int i;
for (i=0;sentence[i]!='\0';i++) {
if ((sentence[i]<='z') && (sentence[i]>='a'))
sentence[i] = 'z' - sentence[i] + 'a';
else if ((sentence[i]<='Z') && (sentence[i]>='A'))
sentence[i] = 'Z' - sentence[i] + 'A';
else continue;
}
}
现在它的工作。
答案 0 :(得分:2)
没有必要考虑单个字符的代码点。只需使用带有所需字母的字符串,然后将其编入索引。
void backwardize(char *s)
{
const char alpha[] = "abcdefghijklmnopqrstuvwxyz";
const size_t alen = (sizeof alpha) - 1;
for(; *s != '\0'; ++s)
{
const char *apos = strchr(alpha, *s);
if(apos != NULL)
*s = alpha[alen - 1 - (apos - alpha)];
}
}
请注意,这仅处理小写,但应该很容易概括。或者将替换字符串作为参数,以便您可以多次调用它。另请注意,我没有测试上面的内容,但它应该接近工作(最坏的情况)。
答案 1 :(得分:1)
你说过算法:
[M] ap字母顺序相反。例如,信 &#39;一个&#39;将被字母&#39; z&#39;取代或者&#39; B&#39; by&#39; Y&#39; (区分大小写)。
实现是替换,并且除了强力替换之外,通常没有可移植的方式来实现它。根据{{3}},只有数字'0'-'9'
才能在正在使用的字符集中具有顺序表示:
5.2.1字符集
...
基本来源和基本 执行字符集应具有以下成员:26 拉丁字母的
uppercase letters
.........
......在两个来源中 和执行基本字符集,后面的每个字符的值 上面的十进制数字列表中的
0
应大于1 以前的价值。 ...
请注意,没有提到必须如何表示字母,因此严格符合C程序不能对字符存储做出任何假设,只能进行替换。这可以使用查找表或长switch
语句来实现。
但是,如果你肯定知道'a'-'z'
和'A'-'Z'
是顺序的,就像数字'0'-'9'
一样,这应该有用(我还没有真正测试过它...... 。):
#include <ctype.h>
char flip( char c )
{
if ( isupper( c ) )
{
c = 'Z' - c + 'A';
}
else if ( islower( c ) )
{
c = 'z' - c + 'a';
}
return( c );
}