比较字符串

时间:2011-03-02 00:46:13

标签: c string string-comparison

谢谢!现在工作得很好。 Java让我变得愚蠢:(

我在比较C中的字符串时遇到一些困难。当我不使用我的isMorse函数时,我得到正确的输出,但是当我使用它时,输出变得不准确并显示随机字符。据我所知,变量“莫尔斯”实际上是在调用strcmp时更改的。我认为它与“莫尔斯”不一样,但我不确定如何补救它。

谢谢!

char *EnglishToMorse(char english)
{
   static char *morse;

   int i;
   for (i = 0; i < LOOKUP_SIZE; i++)
   {
      if (lookup[i].character == english)
      {
         morse = lookup[i].morse;
         return morse;
      }
   }

   morse = &english;  // Problem was here!!!
   return morse;
}

5 个答案:

答案 0 :(得分:3)

我有点猜测。函数EnglishToMorse()可能正在从堆栈返回指向内存的指针。如果是这样,在EnglishToMorse()之后运行另一个函数将改变该内存。这可能是由于EnglishToMorse()中的错误 - 声明char的本地数组并返回指向它的指针。

在没有看到EnglishToMorse()的代码的情况下,这只是一个黑暗中的刺刀。您可以为我们提供更多代码,并获胜。

答案 1 :(得分:1)

你在EnglishToMorse中有一个静态变量,但它是错误的。莫尔斯没有必要是静态的 - 你只需要将它归还。但是你确实需要英语是静态的 - 而不是堆栈 - 因为你返回它的地址。此外,它需要是一个NUL终止字符串。做点什么

char *EnglishToMorse(char english)
{
   static char save_english[2]; /* initialized to 0's */ 

   int i;
   for (i = 0; i < LOOKUP_SIZE; i++)
      if (lookup[i].character == english)
         return lookup[i].morse;

   save_english[0] = english;
   return save_english;
}

但请注意,EnglishToMorse的调用者必须使用结果或在再次调用EnglishToMorse之前保存它,因为第二次调用可能会覆盖static_english。

答案 2 :(得分:0)

看起来问题可能在这个函数中:

char *EnglishToMorse(char english) {
    static char *morse;
    // ...
    morse = &english;
    return morse;
}

您将返回传递给函数的参数(english)的地址。函数返回后(在调用者有机会实际看到该值之前),此参数不再存在。您似乎试图通过将morse变量声明为静态来解决此问题,但这只会使morse变量本身成为静态,而不是它指向的任何内容。< / p>

此外,C中的字符串必须以NUL字符终止。通过返回指向字符的指针(如english),无法保证内存中的下一个字节是否为NUL字符。因此,希望看到NUL终止字符串的调用者可能会得到比他们讨价还价更多的内容。

答案 3 :(得分:0)

char *EnglishToMorse(char english)

morse = &english;
是问题。

永远不要返回指向局部变量或函数参数的指针。

答案 4 :(得分:0)

您的morse变量似乎更改的原因是它指向堆栈上的某个区域。它指向堆栈区域的原因是因为您为其分配了参数english的地址,当您调用函数时它被压入堆栈,然后在函数完成后弹出堆栈。

现在,您的莫尔斯变量将指向堆栈中相同位置的内存,这将在程序的整个生命周期中不断变化。

在我看来,解决这个问题的最好方法是从EnglishToMorse返回NULL指针,如果该字符不是AZ ...然后检查isMorse函数中的NULL指针。毕竟,最好在代码中检查NULL指针。

char* EnglishToMorse(char english)
{
    int i;

    english = toupper(english);
    for (i = 0; i < LOOKUP_SIZE; i++)
    {
        if (lookup[i].character == english)
            return lookup[i].morse;
    }

    return NULL;
}

int isMorse(char* morse)
{
    int i;

    /* Check for NULL, so strcmp doesn't fail. */
    if (morse == NULL) return 0;

    for (i = 0; i < LOOKUP_SIZE; i++)
    {
        if(strcmp(morse, lookup[i].morse) == 0) 
            return 1;
    }

    return 0;
}