C程序无法正常工作

时间:2014-06-03 11:56:27

标签: c alphabet

#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)但它只是打印出一个空字符串。我找不到错误或者我没有看到它。

2 个答案:

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

以上如何运作:

  1. 定义两个应该是1:1映射的字符串,即plain[0]被编码为encoded[0]。这可以更清楚地建模(即由具有该对的struct建模)但随后的初始化变得更加复杂。
  2. c字符串中搜索输入字符plain。如果找不到,则返回NULL,或者找到指向plain内某处的指针。
  3. 在使用其值之前,请确保指针不是NULL
  4. plain减去&plain[0](即app的地址)。对a评分为0,b评分为1,依此类推。
  5. 使用计算的索引在encoded中查找相应的字符。
  6. 如果无法编码,请返回?
  7. 在便携式通用程序中,不能使用简单减法(即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. */
    }