谢谢!现在工作得很好。 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;
}
答案 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;
}