C 比较字符串
谢谢!现在效果很好。Java让我变得愚蠢: 我在比较C语言中的字符串时遇到了一些困难。当我不使用isMorse函数时,我会得到正确的输出,但当我使用它时,输出会变得不准确并显示随机字符。据我所知,当strcmp被调用时,变量morse实际上发生了变化。我认为这与莫尔斯不是常数有关,但我不确定如何纠正它 谢谢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
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别忘了接受答案。这里有好几家,不仅仅是我的。