连接两个字符指针

Concate two char pointers

我刚学C,到了指针的地步。我写了一个应该连接两个 char 指针的方法,我得到了一个奇怪的行为,我无法向自己解释,也没有找到答案,所以也许你可以帮忙!

所以我不明白为什么 stringcatstringptr 指向不同的地址,即 8 字节的地址。其次,我不明白为什么我不能在底部的两个 while 循环中使用 stringcat。我只是没有得到任何输出。另外,如果我在最后一个 printf 中使用 stringptr[0],则不会有任何输出。

提前感谢您的帮助!

编辑:此代码有效,我只是不明白为什么我不能在底部使用 stringcat

Edit2:注意到一些 * 在复制粘贴时丢失了,所以我添加了它们!

char stringcat(const char str1, const char* str2){
  char *ptr1 = str1;
  char *ptr2 = str2;
  int count = 0;

  while(*ptr1 != '[=10=]'){
    count++;
    ptr1++;
  }

  while(*ptr2 != '[=10=]'){
    count++;
    ptr2++;
  }

  char *stringcat = malloc((count+1)*sizeof(char));
  char *stringptr = stringcat;

  printf("%d %d", &stringcat, &stringptr);

  ptr1 = str1;
  ptr2 = str2;

  while(*ptr1 != '[=10=]' && (stringptr++ = ptr1++));
  printf("%c", stringcat[0]);
  while(*stringptr++ = *ptr2++);

  return stringcat;
}

您犯了一些错误。有些会被编译器报告,但你必须打开警告。

如何调用 stringcat 以及 return 是什么?这是开发 function.One 方法的基本(第一个)问题是它得到两个字符串连接和 returns 一个新字符串,第二个连接到第一个。另一种方法是 return 第一个字符串与第二个字符串相连。

对于第一种方法,它必须分配可以容纳两个字符串的新存储空间,这样就是newstring= malloc(strlen(str1)+strlen(str2)+1);不要忘记为字符串的终止空值添加 1。

对于第二种方法,本质上是一样的,只是str1本身必须用malloc分配,因为你的函数会调用freerealloc重新分配(更长的)字符串所需的存储空间。

在这两种情况下,函数看起来都像 char *stringcat(char *str1, char *str2)。我认为有了这个输入,您可以自己编写函数的其余部分。

您正在创建一个指向 char 的 char 指针。问题是,您没有将 char 变量分配给指针,而是分配给 char 的地址。

所以,你应该改变你的:

char *ptr1 = str1

收件人:

char *ptr1 =&str1

这是因为&var获取的是变量的地址。

然后,您还使用了 *stringptr++,它增加了它指向的字符的 ,而不是地址 space。

我强烈建议您阅读 K&R 书。对于新手和已经了解 C 的人来说,这都是一本很棒的书。事实上,其中解决的问题之一就是这个。

1)

printf("%d %d", &stringcat, &stringptr);

打印变量stringcat和stringptr的地址,它们是不同的,它们被分配到堆栈中,所以,推测,你正在编译一个x64位程序,所以它们相隔8个字节。

这个

printf("%d %d", stringcat, stringptr);

就是你想要的。

我只是对您的代码进行了最少的更改以使其正常工作:

char* stringcat(const char* str1, const char* str2) {
    const char *ptr1 = str1;
    const char *ptr2 = str2;
    int count = 0;

    while (*ptr1 != '[=12=]') {
        count++;
        ptr1++;
    }

    while (*ptr2 != '[=12=]') {
        count++;
        ptr2++;
    }

    char *stringcat = (char *)malloc((count + 1) * sizeof(char));
    char *stringptr = stringcat;

    printf("%d %d", stringcat, stringptr);

    ptr1 = str1;
    ptr2 = str2;

    while (*ptr1 != '[=12=]' && (*stringptr++ = *ptr1++));
    printf("%c", stringcat[0]);
    while (*ptr2 != '[=12=]' && (*stringptr++ = *ptr2++));

    *stringptr++ = '[=12=]';

    return stringcat;
}

关于问题 1,stringcatstringptr 确实指向地址。不同的是&stringcat&stringptr
通过声明 char *var = malloc(...),您将在堆栈中保留内存 space,假设地址 30,用于指针变量 var,然后让 var包含 malloc-ed 的地址,比方说地址 200(驻留在堆内存中)。
当您继续 char *var2 = var 时,您在堆栈中保留了另一批内容来存储新的指针变量 var2,很可能是 31。然后,您分配 var2 来保存包含在 var 中的地址,即 200.
因此,地址 3031 中的变量都将包含地址 200。通过使用 &var 你得到的实际上是 30 而不是你期望的 200 。当然,&var2 与值 31 不同。

对于第二个问题,很难理解您要查找的内容,因为代码中存在其他答案所反映的错误。