-3

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

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

提前谢谢你的帮助!

编辑:这段代码有效,我只是不明白为什么我不能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

4 回答 4

0

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

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

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

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

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

于 2017-07-22T14:44:05.947 回答
0

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

所以,你应该改变你的:

char *ptr1 = str1

到:

char *ptr1 =&str1

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

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

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

于 2017-07-22T14:53:35.047 回答
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;
}
于 2017-07-22T14:55:30.770 回答
0

关于问题 1,stringcat请务必stringptr指向地址。它是&stringcat&stringptr那个是不同的。
通过声明char *var = malloc(...),您在堆栈中保留了一个内存空间,比如说 address 30,用于指针变量 ,var然后让var包含任何被 malloc 的地址,比如说 address 200(驻留在堆内存中)。
当您继续时,您很可能会char *var2 = var在堆栈中保留另一批来存储新的指针变量。然后,您指定保存包含在 中的地址,即. 因此,地址中 的变量都将包含地址var231var2var200
3031200. 通过使用&var你得到的实际上是30而不是200你所期望的。自然,&var2与 的值会有所不同31

对于第二个问题,很难理解您在寻找什么,因为代码中存在错误,正如其他答案所反映的那样。

于 2017-07-22T14:57:36.543 回答