繁体   English   中英

C程序无法正常工作

[英]C program doesn't work correctly

#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);
}

例如,如果我给“ a”,则应返回“ d”(每个字母将转换为alfavita数组的3d),但是它只是为我输出一个空字符串。 我找不到错误或看不到它。

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';
}

您可以使用为每个字符提供替换字符的表。

然后通过将索引计算为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. plain字符串中搜索输入字符c 如果未找到,则返回NULL ,或者返回到找到的plain内部某处的指针。
  3. 使用指针的NULL之前,请确保该指针不为NULL
  4. 减法plain (即&plain[0]则该地址a从) pp a值为0, b值为1,依此类推。
  5. 使用计算出的索引查找已encoded的对应字符。
  6. 编码失败时,返回?

在可移植的通用程序中,您不能使用普通减法(即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. */
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM