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 */
}