[英]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个问题:
current_line
分配 memory !temp
分配足够的 memory 。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 内部有效。
一旦你尝试在外面使用它,它就是“未定义的行为”,所以任何事情都可能发生,包括段错误。
有两种方法可以解决此问题:
malloc
并在堆上分配 memory。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.