Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 比较字符串_C_String_String Comparison - Fatal编程技术网

C 比较字符串

C 比较字符串,c,string,string-comparison,C,String,String Comparison,谢谢!现在效果很好。Java让我变得愚蠢: 我在比较C语言中的字符串时遇到了一些困难。当我不使用isMorse函数时,我会得到正确的输出,但当我使用它时,输出会变得不准确并显示随机字符。据我所知,当strcmp被调用时,变量morse实际上发生了变化。我认为这与莫尔斯不是常数有关,但我不确定如何纠正它 谢谢 char *EnglishToMorse(char english) { static char *morse; int i; for (i = 0; i < LO

谢谢!现在效果很好。Java让我变得愚蠢:

我在比较C语言中的字符串时遇到了一些困难。当我不使用isMorse函数时,我会得到正确的输出,但当我使用它时,输出会变得不准确并显示随机字符。据我所知,当strcmp被调用时,变量morse实际上发生了变化。我认为这与莫尔斯不是常数有关,但我不确定如何纠正它

谢谢

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

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


没有看到英文莫尔斯电码,这只是一种暗中的尝试。您可以提供更多代码供我们查看,并获得成功。

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


没有看到英文莫尔斯电码,这只是一种暗中的尝试。您可以为我们提供更多代码以供查看,并获得成功。

看起来此函数中可能存在问题:

char *EnglishToMorse(char english) {
    static char *morse;
    // ...
    morse = &english;
    return morse;
}
返回传递到函数中的参数english的地址。此参数在函数返回后和调用方有机会实际看到值之前不再存在。似乎您试图通过声明morse变量为static来修复此问题,但这只会使morse变量本身为static,而不是它指向的任何对象


此外,C中的字符串必须以NUL字符结尾。通过返回指向单个字符的指针(如英语),无法保证内存中的下一个字节是或不是NUL字符。因此,希望看到以NUL结尾的字符串的调用者可能会得到比他们预期的更多的东西。

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

char *EnglishToMorse(char english) {
    static char *morse;
    // ...
    morse = &english;
    return morse;
}
返回传递到函数中的参数english的地址。此参数在函数返回后和调用方有机会实际看到值之前不再存在。似乎您试图通过声明morse变量为static来修复此问题,但这只会使morse变量本身为static,而不是它指向的任何对象

此外,C中的字符串必须以NUL字符结尾。通过返回指向单个字符的指针(如英语),无法保证内存中的下一个字节是或不是NUL字符。因此,希望看到以NUL结尾的字符串的调用者可能会得到比他们预期的更多的信息。

char*EnglishToMorsechar english 和 莫尔斯=&英语; 这就是问题所在

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

char*EnglishToMorsechar english 和 莫尔斯=&英语; 这就是问题所在

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

莫尔斯变量出现变化的原因是它指向堆栈上的某个区域。它指向堆栈上某个区域的原因是,您为它指定了参数english的地址,该参数在调用函数时被推到堆栈上,然后在函数完成后从堆栈中弹出

现在,您的morse变量将指向堆栈上具有相同位置的内存,它将在程序的整个生命周期中不断变化

在我看来,解决这个问题的最佳方法是,如果字符不是a-Z,则从EnglishToMorse返回一个空指针。。。然后检查isMorse函数中的空指针。毕竟,检查代码中的空指针是一种很好的做法

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;
}
莫尔斯变量出现变化的原因是它指向堆栈上的一个区域。它指向堆栈上某个区域的原因是,您为它指定了参数english的地址,该参数在调用函数时被推到堆栈上,然后在函数完成后从堆栈中弹出

现在,您的morse变量将指向堆栈上具有相同位置的内存,它将在程序的整个生命周期中不断变化

在我看来,解决这个问题的最佳方法是,如果字符不是a-Z,则从EnglishToMorse返回一个空指针。。。然后检查isMorse函数中的空指针。毕竟,检查代码中的空指针是一种很好的做法

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

英语中有一个静态变量,但它是错误的。莫尔斯没有必要是静态的——您只需返回它。但是你确实需要英语是静态的,而不是在堆栈上,因为你返回了它的地址。而且,它需要是一个NU 以L结尾的字符串。做点像

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。

您在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。

您说输出不准确,但示例代码没有任何输出语句。请发布一个简短、完整、可运行的示例,演示您正在看到的行为不要忘了提及您希望看到的内容。您确定EnglishToMorse正在返回以NULL结尾的字符串吗?strcpconst char*,const char*不应更改您的morse变量查找数组是什么?注意空格、制表符、换行符:-与--\n或--不同。您说输出不准确,但示例代码没有任何输出语句。请发布一个简短、完整、可运行的示例,演示您正在看到的行为不要忘了提及您希望看到的内容。您确定EnglishToMorse正在返回以NULL结尾的字符串吗?strcpconst char*,const char*不应更改您的morse变量查找数组是什么?注意空格、制表符、换行符:--与--\n或--.+1不同-如果数据没有调用isMorse就正常,则这听起来很可能,因为它可能仍然位于堆栈上。调用另一个函数将导致新内容被推送到堆栈上。感谢您的回复。我是否应该将morse作为一个附加参数传递到EnglishToMorse中,而不是将其声明为局部静态变量?+1-如果数据没有调用isMorse,这听起来很可能是正常的,因为它可能仍然位于堆栈上。调用另一个函数将导致新内容被推送到堆栈上。谢谢你的回复。我是否应该将morse作为一个附加参数传递到英语中,而不是将其声明为局部静态变量?@Cory别忘了接受答案。这里有好几个,不仅仅是我的。@Cory别忘了接受答案。这里有好几家,不仅仅是我的。