c - 函数不打印结果

标签 c function pointers

我必须创建一个连接两个字符串的函数,但我必须在第一个单词后添加“\n”。我弄清楚了一切,但由于某种原因它没有打印出任何东西。有任何想法吗?它可能必须对指针做一些事情。我就是无法理解他们。这是代码。

char *function(char *s1, char *s2){
    char *newStr;
    int size;
    size = strlen(s1) + strlen(s2);

    newStr = (char *)malloc((size+1)*sizeof(char));

    while(*s1!= '\0'){
        *newStr = *s1;
        newStr++;
        s1++;
    }
    *newStr = '\n';
    newStr++;
    while(*s2 != '\0'){
        *newStr = *s2;
        newStr++;
        s2++;
    }
    *newStr = '\0';
return newStr;
}

int main (int argc, const char * argv[]) {
    char *str1 = "Hello";
    char *str2 = "World";

    printf("%s",function(str1, str2));

     return 0;
}

所以结果我应该得到:

Hello
World

但我没有得到任何返回。

最佳答案

您返回的是指向缓冲区末尾的指针,而不是指向缓冲区开头的指针。看一下函数的最后两行:

*newStr = '\0';
return newStr;

显然,这会返回一个指向 null char 的指针,即空字符串。

通过引入一个临时指针来解决该问题,您将使用该指针逐步遍历输出缓冲区。然后您可以将指针返回到输出缓冲区的开头。

char *function(char *s1, char *s2){
    int size = strlen(s1) + strlen(s2) + 2;//one for '\n', one for '\0'
    char *result = malloc(size);
    char *p = result;

    while(*s1 != '\0'){
        *p = *s1;
        p++;
        s1++;
    }
    *p = '\n';
    p++;
    while(*s2 != '\0'){
        *p = *s2;
        p++;
        s2++;
    }
    *p = '\0';

    return result;
}

您还需要为 \n 分配一个额外的字符,如上所示。最后,您的调用代码永远不会释放 function 分配的内存。

关于c - 函数不打印结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9861110/

相关文章:

C++ "destructive procedural variant"导致先前版本的二叉搜索树丢失

c++ - 为什么 A[i][j] 和 *((int*)A + i * n + j) 给出不同的输出?

c - 如何为字符指针添加偏移量?

javascript - 当我们可以直接调用方法时,为什么我们需要在javascript中调用或应用方法?

c - 什么时候在C中分配内存?

c - 警告 : control reaches end of non-void function [-Wreturn-type]

sql - 当多个函数使用它时如何改变复合类型?

pointers - 如何创建可以以线程安全方式传递给 FFI 函数的未初始化指针?

c - 在 C 中更新全局变量

c - 为什么我得到 "Segmentation fault (core dumped)"