结束两个char指针

时间:2017-07-22 14:31:16

标签: c pointers char-pointer

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

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

提前感谢您的帮助!

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

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

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

  while(*ptr1 != '\0'){
    count++;
    ptr1++;
  }

  while(*ptr2 != '\0'){
    count++;
    ptr2++;
  }

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

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

  ptr1 = str1;
  ptr2 = str2;

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

  return stringcat;
}

4 个答案:

答案 0 :(得分:0)

你犯了很多错误。有些将由编译器报告,但您必须打开警告。

如何调用stringcat以及返回什么?这是开发函数时必不可少的(第一个)问题。一种方法是它获取两个字符串以连接并返回一个新字符串,第二个字符串连接到第一个字符串。另一种方法是它返回第一个字符串,第二个字符串连接到它。

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

对于第二种方法,它基本上是相同的,除了str1本身必须已经用malloc分配,因为你的函数将调用freerealloc来重新分配存储(较长)字符串所需。

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

答案 1 :(得分:0)

您正在创建指向char的char指针。问题是,你没有将char变量赋给指针,而是指定char的地址。

所以,你应该改变你的:

char *ptr1 = str1

要:

char *ptr1 =&str1

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

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

我强烈建议你阅读K& R书。对于新手和已经认识C的人来说,这本书都是一本很好的书。事实上,其中一件事就是这样。

答案 2 :(得分:0)

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 != '\0') {
        count++;
        ptr1++;
    }

    while (*ptr2 != '\0') {
        count++;
        ptr2++;
    }

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

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

    ptr1 = str1;
    ptr2 = str2;

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

    *stringptr++ = '\0';

    return stringcat;
}

答案 3 :(得分:0)

与问题1相关,stringcatstringptr确实指向了地址。 &stringcat&stringptr不同 通过声明char *var = malloc(...),您要在堆栈中保留一个内存空间,让我们说地址30,指针变量var,然后让var包含malloc编辑的地址,让我们说地址200(位于堆内存中)。
当您继续char *var2 = var时,您在堆栈中保留另一批来存储新指针变量var2,很可能是31。然后,您指定var2来保存var中包含200的地址。 因此,地址3031中的变量都包含地址200。使用&var您获得的内容实际上是30,而不是您期望的200。当然,&var231的值不同。

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