strcmp更改字符串的值
这称为范围strcmp更改字符串的值,c,C,这称为范围 void fix_word(char* pword, int j){ if (*(pword + j) != '\0'){ if (j == 0 && (*(pword + j) >= 'a' && *(pword + j) <= 'z')){ *pword -= N; j++; } else if (*(pword + j) >=
void fix_word(char* pword, int j){
if (*(pword + j) != '\0'){
if (j == 0 && (*(pword + j) >= 'a' && *(pword + j) <= 'z')){
*pword -= N;
j++;
}
else if (*(pword + j) >= 'A' && *(pword + j) <= 'Z'){
*(pword + j) += N;
j++;
}
else
j++;
fix_word(pword, j);
}
}
您已经在两个不同的范围内声明了变量“word”,并且混合使用它
如果省略第二个“char*”,则一切正常。否,
strcmp
不会修改数据。您的代码中有一个bug。遗憾的是,您没有显示该程序的完整和精简版本。也许错误在代码的其他地方,我们看不到的代码。也许在这里。谁知道呢?这几乎肯定意味着你的word
指向从函数返回的本地内存,而strcmp()
则是在无意中重用堆栈。尽管如此,这并不是代码中的问题所在。返回指向本地(非静态)变量的指针,然后使用该指针(例如,将其传递到strcmp())会导致未定义的行为。(还要记住,这不是恭维。)。。移除循环中的free
和malloc
(没有很好的理由这么做!)来测试@Jonathan的理论。另外,永不、永不、永不、永不使用get()
。请参见在调用gets()
之后是否打印了word
的内容?调用fix\u word()
后,不只是var;应该删除整个无内环malloc策略。请求的内存量与最初分配的内存量相同。内部free
和随后的内部malloc
都应该被完全删除。@jamesgiacomokominotarosonino:如果你做得正确,这是一个性能问题,而不是更严重的问题。分配内存比不分配内存慢。另一方面,用户在终端键入的速度比内存分配慢得多,但并非所有程序都会在人工键入输入的情况下运行。如果编译器是GCC,则使用-Wshadow
将自动突出显示此类问题。@jamesgiacomokino-tarosonino:仍不工作吗?还有别的东西也坏了。但是“其他东西”不是strcmp()——当然,除非您编写了自己的版本。您确定在重新测试之前重新编译了吗?如果不调用fix\u word()
,会发生什么?如果不调用search\u word()
并简单地将index=-1代码>相反?@JonathanLeffler你是对的。令人惊讶的是,fix\u word()
正在制造问题。我已经添加了fix\u word()
函数的代码。我想不出可能是什么问题。
void fix_word(char* pword, int j){
if (*(pword + j) != '\0'){
if (j == 0 && (*(pword + j) >= 'a' && *(pword + j) <= 'z')){
*pword -= N;
j++;
}
else if (*(pword + j) >= 'A' && *(pword + j) <= 'Z'){
*(pword + j) += N;
j++;
}
else
j++;
fix_word(pword, j);
}
}
char* word = (char*)malloc(WORD_SIZE * sizeof(char)); /* 1 */
while (strcmp(word, "Exit")){ /* 1 */
free(word); /* 1 and gone */
char* word = (char*)malloc(WORD_SIZE * sizeof(char)); /* 2 */
}