strcmp函数改变字符串的值

4
void search(char*** p, int numOfWords, int* pNumOfDefArr){
int i, j, index;
char* word = (char*)malloc(WORD_SIZE * sizeof(char));
for (i = 0; i < N; i++) //just clearing the screen
    printf("\n");
printf("Hello and thank you for filling Dictionary 1.0 with new words!!\n");
printf("Which word are you looking for??\n");
gets(word);
fix_word(word, 0);
while (strcmp(word, "Exit")){
    index = (search_word(p, word, 0, numOfWords - 1, 0));
    if (index < 0)
        printf("Unknown word!!!!!!\n");
    else{
        for (j = 0; j < pNumOfDefArr[index]; j++)
            printf("%s\n", *(*(p + index) + 1 + j));
    }
    free(word);
    char* word = (char*)malloc(WORD_SIZE * sizeof(char));
    printf("Looking for another word?\n");
    gets(word);
    fix_word(word, 0);
}
printf("Farewell!!\n");

在调试器中,我可以看到在第10行:while (strcmp(word, "Exit")),word的值从"asd"变成了"Error reading characters of string." 为什么会这样呢?
这是fix_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);
    }
}

3
不,strcmp不会修改您的数据。您的代码中存在一个错误。遗憾的是您没有展示完整且简化版本的程序。也许错误在代码的其他地方,我们无法看到的代码中。也许错误就在这里。谁知道呢? - David Heffernan
2
这几乎可以肯定意味着你的word指向从函数返回的本地内存,而strcmp()无意中重新使用了堆栈。话虽如此,这并不是在此代码中的问题是自证清白的。返回指向本地(非静态)变量的指针,然后使用该指针(例如将其传递给strcmp())会导致未定义行为。(还要记住,Three-Star Programmer并不是恭维的话)。 - Jonathan Leffler
1
绝对不要使用 gets() 函数,无论什么情况下都不要使用,绝对绝对不要使用,更加绝对地说:千万不要使用。请参考为什么gets()函数很危险? - Jonathan Leffler
在调用gets()函数后,您是否打印了word的内容?在调用fix_word()函数后呢? - Jonathan Leffler
WORD_SIZE 的值是多少? - chux - Reinstate Monica
显示剩余10条评论
1个回答

6

这被称为作用域。

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

你在两个不同的作用域中声明了变量“word”,并且你交错使用了它。
如果你省略第二个“char *”,所有内容都将正常。

1
@JamesGiacomoKintaroSonnino:如果你做得正确,那么这只是一个性能问题,而不是更严重的问题。分配内存比不分配内存慢。另一方面,在终端上输入的用户比内存分配要慢得多,但并非所有程序都将由人类输入运行。 - Jonathan Leffler
1
如果编译器是GCC,使用“-Wshadow”将自动突出显示此类问题。 - Jonathan Leffler
@JonathanLeffler 我正在使用VS2013。 - James Giacomo Kintaro Sonnino
1
@JamesGiacomoKintaroSonnino:还是不行吗?那么肯定还有其他的问题。但是这个问题不可能是strcmp(),除非你自己写了一个版本。你确定重新编译后重新测试了吗?如果你不调用fix_word()会发生什么?如果你不调用search_word()而只是将index=-1,会发生什么? - Jonathan Leffler
1
@JonathanLeffler 您是对的。令人惊讶的是,fix_word() 函数正在造成问题。我已经添加了 fix_word() 函数的代码。我无法弄清楚可能出现的问题。 - James Giacomo Kintaro Sonnino
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接