后向字母的算法是什么?

时间:2016-05-13 09:58:41

标签: c algorithm

我尝试在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;
    }    
}

现在它的工作。

2 个答案:

答案 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 );
}