c - Strcmp 与 C 中的 Printf 矛盾

标签 c string pointers

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

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

在 void 函数的末尾:

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

主要内容:

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

类似的事情发生在几个较长的文件路径上(较短的字符串似乎是免疫的)。我在两个字符缓冲区(用于目录路径和文件名)上使用 strcpy 和 strcat 在 void 函数内创建字符串。

真正奇怪的是 - 我添加了 strcmpstrlen检查 *ptr两个地方的字符串(在 void 函数的末尾和 main 中),以及:

  1. strlen 对于两者来说是相同的,尽管外部打印的字符串显然更长!参见上面的例子。我可以清楚地看出,因为每个字符串都打印在新行上。
  2. strcmp 返回 0,即使打印的字符串明显不同。

我无法解释这种行为...函数内部和外部 *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);
}

最佳答案

However, I check the pointer again in main, just after the void is called, and the result doesn't seem to be maintained.

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

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);

关于c - Strcmp 与 C 中的 Printf 矛盾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38927744/

相关文章:

c++ - 如果有和没有花括号

c - 中断和缺页错误的区别

javascript - 使用正则表达式替换第二个正斜杠后面的字符串

c++ - 处理数组

c - C语言: convert a number grade into a letter grade

结构之间的转换?

python - 检查字符串是否不是反序列化的 json 或 python 中的列表

c# - 正则表达式删除特定字符串(如果存在)

c++ - 返回成员变量时,为什么在函数内外得到不同的结果?

c++ - 使用结构本身的类型定义结构参数