棘手的C char指针问题

时间:2015-04-26 02:18:57

标签: c pointers

所以我试图编写一个函数,它将接收两个指向chars的指针并返回一个指向它们串联的新指针。这是我的尝试:

#include <stdio.h>
#include <stdlib.h>

char * append (char *, char *);

int main(void) {

  char *start = "start";
  char *add = "add";
  char* newString = append(start, add);
  printf("%s\n", newString);
  return 0;
}

char * append(char *start, char *add) {
  char *newArray = malloc(sizeof(char) * 100);
  //get to end of start word
  while (*start != '\0') {
    *newArray = *start;
    newArray++;
    start++;
  }
  while (*add != '\0') {
     *newArray = *add; 
     newArray++;
     add++;
  }
  return newArray;
}

两个问题:

1)截至目前,它编译但没有任何内容被打印出来。我想这是因为我的append函数返回一个指向连接字符末尾的指针。我应该在一开始创建一个临时字符指针并将其设置为newArray(所以我可以返回它)?否则,我必须以某种方式递减指针,直到我回到开始。但是没有价值(比如&#39; \ 0&#39;对于字符串的结尾)会告诉我我在char数组的开头......

2)我读到我不能把sizeof()作为一个char指针,所以我不确定在我的append函数的第一行作为我对malloc的参数传递什么。 100只是一个足够大的&#34;我想摆脱的神奇数字......

如果我可以将sizeof()作为char指针,我只是这样做:

char *newArray = malloc(sizeof(strlen(start) + strlen(add)) + 1);

感谢您的帮助,

bclayman

1 个答案:

答案 0 :(得分:2)

1)是的,您需要将指针保存到已分配内存的开头,以便您可以返回它。最好将该指针视为“真实”指针,并在将字符存储为临时时增加指针,但它确实没有区别 - 指针是指针

2)这就是strlen的用途 - 它告诉你字符串的长度。所以你想要

char *newArray = malloc(strlen(start) + strlen(add) + 1);

根本不需要sizeof

有了这一切,你最终会得到:

char *append(char *start, char *add) {
  char *newArray = malloc(strlen(start) + strlen(add) + 1);
  if (!newArray) return 0; // out of memory
  char *copy = newArray;
  //get to end of start word
  while (*start != '\0')
    *copy++ = *start++;
  while (*add != '\0')
    *copy++ = *add++;
  *copy = 0; // add a final NUL terminator 
  return newArray;
}