Strcmp在C

时间:2016-08-12 23:31:52

标签: c string pointers

我传递一个指向void函数的指针,其目的是动态分配和创建一个字符串(包含一个完整的文件路径)。

在函数结束时,我检查printf(%s)并且该函数似乎工作正常(对于我的示例运行中的~10个测试文件)。但是,我在main中再次检查指针,就在调用void之后,结果似乎没有得到维护。

在void函数结束时:

printf("%s\n", *ptr) returns usr/path/file

主要:

printf("%s\n", *ptr) returns usr/path/fil50(??

这样的东西发生在几个较长的文件路径上(较短的字符串似乎免疫)。我在void函数中使用两个char缓冲区(对于目录路径和文件名)使用strcpy和strcat创建字符串。

非常奇怪的是 - 我在两个地方(在void函数和main的末尾)的strcmp字符串中添加了strlen*ptr检查,并且:

  1. strlen与两者相同,即使外部打印的字符串明显更长!见上面的例子。我可以清楚地说出来,因为每个字符串都印在一个新行上。
  2. strcmp返回0,即使打印的字符串明显不同。
  3. 我无法解释这种行为......函数内外* ptr的变化是一回事,但printf和strcmp如何相互矛盾?

    我找不到任何经历过这种情况的人,并会感激任何帮助。

    编辑 - 我应该提到void函数试图替换浪费大量内存的现有内部主操作(在大量缓冲区上调用sprintf)。坦率地说,我只是问一个关于strcmp和printf之间矛盾的一般性问题,但我当然愿意提供更多的证据。

    int main(int argc, char *argv[]) {
    char buff[MASSIVE_SIZE];
        sprintf(buff, "%s/%s", dir, path->d_name);
        char **ptr = (char **)malloc(sizeof(char*));
        make_full_path(dir, path->d_name, ptr);
        printf("external, strcmp:%d\n%s\n", strlen(*ptr), *ptr);
        printf("strcmp=%d\n", strcmp(buff, *ptr));
    }
    
    
    void make_full_path (const char *dir_name, char *other_name, char **pptr){
    int len_one = strlen(dir_name);
    int len_two = strlen(other_name);
    
    char dest[len_one+2];
    strcpy(dest, dir_name);
    dest[len_one] = '/';
    dest[len_one+1] = '\0';
    char src[len_two+1];
    strcpy(src, other_name);
    src[len_two] = '\0';
    *pptr = strcat(dest, src);
    printf("internal, strlen=%d:\n%s\n", strlen(*pptr), *pptr);
    }
    

1 个答案:

答案 0 :(得分:2)

  

但是,我在main中再次检查指针,就在调用void之后,结果似乎没有得到维护。

这可能只意味着一件事:你正在返回一个指向本地的指针。这是未定义的行为:

char dest[len_one+2];
...
*pptr = strcat(dest, src); // Passing a local back to main

将其替换为malloc,可以解决问题:

char dest[len_one+strlen(other_name)+2];
...
strcat(dest, src);
*pptr = malloc(strlen(dest)+1);
strcpy(*pptr, dest);