繁体   English   中英

如何实现 function 以连接到 char* 而不是 char 数组?

[英]How can I implement a function to concatenate to a char* and not char array?

如何实现 function 将某些内容连接到 char* (不是 char 数组)? 我想要的示例:

#include <stdio.h>
#include <string.h>

int main() {
  char* current_line;
  char temp[1];
  sprintf(temp, "%c", 'A');
  // This causes a seg fault. I of course don't want that, so how do I get this to work properly?
  strcat(current_line, temp);
  return 0;
}

我该如何解决这个问题以使其正常工作(请告诉我是否需要在我的问题中添加任何内容或指出正确的方向,因为我找不到任何东西)?

编辑:我做了这个,但它出现了故障

char* charpointercat(char* mystr, char* toconcat) {
  char ret[strlen(mystr) + 1];
  for(int i = 0; mystr[i] != '\0'; i++) {
    ret[i] = mystr[i];
  }
  return ret;
}

你有3个问题:

  1. 您根本没有为current_line分配 memory !
  2. 您没有为temp分配足够的 memory 。
  3. 您从charpointercat返回指向局部变量的指针。

第一个应该很明显,并在评论中进行了解释:
char *current_line仅包含指向某些字节的指针,但如果您想使用 function (如stracat )存储某些内容,则需要分配实际字节。

对于第二个,请注意sprintf(temp, "%c", 'A'); 至少需要char temp[2]因为它将使用一个字节作为“A”,而一个字节用于终止 null 字符。

由于sprintf不知道temp有多大,它会超出它,这就是你得到段错误的方式。

至于你的charpointercat一旦 function 退出, ret不再存在。

更准确地说:
C 中的数组由其第一项(单元格)的指针(memory 地址)表示。

所以,行return ret; 不返回ret中所有字节的副本,而只返回指向第一个字节的指针。

但是那个 memory 地址只在charpointercat function 内部有效。
一旦你尝试在外面使用它,它就是“未定义的行为”,所以任何事情都可能发生,包括段错误。

有两种方法可以解决此问题:

  1. 了解如何使用malloc并在堆上分配 memory。
  2. 将第三个数组传递给 function 以便它可以将结果存储在那里(与sprintf相同)。

从您发布的第一个代码来看,您似乎想将一个字符连接到一个字符串的末尾......此代码将返回一个字符串,该字符串由第一个字符串和第二个字符串组成,它不会更改参数。

char* charpointercat(char* mystr, char toconcat) {
    char *ret = (char*) malloc(sizeof(char)*(strlen(mystr) + 2));
    int i;
    for(i = 0; mystr[i] != '\0'; i++) {
        ret[i] = mystr[i];
     }
     ret[i] = toconcat;
     ret[i + 1] = '\0';
     return ret;
 }

这应该有效:

char* charpointercat(char* mystr, char* toconcat) {
  size_t l1,l2;
  //Get lengths of strings
  l1=strlen(mystr);
  l2=strlen(toconcat);
  //Allocate enough memory for both
  char * ret=malloc(l1+l2+1);
  strcpy(ret,mystr);
  strcat(ret,toconcat);
  //Add null terminator
  ret[l1+l2]='\0';
  return ret;
}

int main(){
  char * p=charpointercat("Hello","World");
  printf("%s",p);
  //Free the memory
  free(p); 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM