功能不打印结果

时间:2012-03-25 14:56:55

标签: 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

但我没有得到任何回报。

4 个答案:

答案 0 :(得分:4)

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

*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分配的内存。

答案 1 :(得分:0)

我会看看两件事:

  • 您为新字符串分配了多少空间,并将其与您实际写入该字符串的字符数进行比较。
  • 返回指针指向的字符串中的位置。

答案 2 :(得分:0)

function()返回指向已分配char[]中最后一个元素的指针 - 而不是将指针返回到第一个元素。

每次执行newStr++;时,都会增加实际指针,然后再返回。为了解决这个问题,你可以做以下其中一个:

  1. 创建指针newStr的副本,该指针初始化为与newStr相同并增加它 - 保持原样newStr
  2. 创建索引[让它为i]并增加它,并使用newStr[i]访问已分配的数组。

答案 3 :(得分:0)

我已经为你调试了代码。这是调试代码:

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

    newStr = (char *) malloc((size + 2) * sizeof(char));
    str = newStr;
    while (*s1 != '\0') {
        *(newStr++) = *(s1++);
    }
    *newStr = '\n';
    newStr++;
    while (*s2 != '\0') {
        *newStr = *s2;
        newStr++;
        s2++;
    }
    *newStr = '\0';
    return str;
}

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

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

    return 0;
}

实际问题是,当你将newStr递增到最后一次时,当你从function()返回它时,它指向缓冲区的末尾。即'\0'。这就是它没有出现的原因。现在在上面的代码中,我引入了一个变量str,它指向字符串newStr的开头。

希望你能理解......

...和平