我试图创建一个方法,给定多个字符串,将它们合并在一起。现在,这就是我提出的。主要是纯粹用于测试,所以最后我只有一个部分字符串,该部分属于完整字符串的位置,以及我需要放置这些部分的最终字符串。
int mergeParts(char* text, char* part, int position){
int printSpot = position * CONTENTSIZE;
strcat(text[printSpot], part);
printf("%s\n", text);
return 0;
}
现在,此代码的问题是分段错误,我尝试了多项内容,但唯一可行的方法是使用strcat(text, part);
而不使用" location"必须复制字符串的一部分。
#define CONTENTSIZE 10
int main(){
int i;
char* part1 = "This is a ";
char* part2 = "test with ";
char* part3 = "something ";
char* part4 = "that i wro";
char* part5 = "te in it";
int totParts = 5;
char* parts[totParts] = {part1,part2,part3,part4,part5};
int stringSize = totParts * CONTENTSIZE;
char* finalString = malloc(stringSize);
for(i = 0; i<totParts; i++){
mergeParts(finalString, parts[i], i);
}
return 0;
}
如何在字符串中指定复制零件的位置。
一个很好的例子,我可以让你更好地解释我正在寻找的是:
我有一个空字符串"------------------------------"
我必须写在"This "; "is an"; " exam"; "ple o"; "f the"; " text";
如果我收到" exam";
,则字符串中的结果必须为"---------- exam---------------"
。
然后我收到&#34;文本&#34 ;;所以结果将是"---------- exam---------- text"
依此类推,直到我有"This is an example of the text";
答案 0 :(得分:2)
似乎strcat(text[printSpot], part);
就是重点。我认为你应该使用strcat(&(text[printSpot]), part);
代替。 text[printSpot]
将包含'e'
之类的实际字符数据,而不是strcat
所需字符串的地址。
或者您可以简单地使用strcat(text+printSpot,part)
。
答案 1 :(得分:2)
导致段错误的主要问题是您没有将正确的参数传递给strcat
:
strcat(text[printSpot], part);
两个参数都应该是char *
类型,但是对于第一个参数,您传递的是char
。在指向预期的位置传递非指针会调用undefined behavior。在这种情况下,传入的字符被解释为地址(无效),并且该无效地址被解除引用,从而导致崩溃。
您应该传递该数组元素的地址:
strcat(&text[printSpot], part);
您还没有初始化finalString
中的字节。 strcat
函数期望其第一个参数指向一个以空字符结尾的字符串,但由于没有初始化已分配的字节,因此您可能会读取已分配内存的末尾,这会再次调用未定义的行为。
在finalString
中添加一个空字符串将解决此问题:
strcpy(finalString, "");
或等效地:
finalString[0] = '\x0';
这允许测试程序正常工作,您按顺序附加到空字符串,但它不满足更新现有字符串部分的要求,可能在中间。在附加第二个参数后,使用strcat
将空终止目标字符串,从而导致丢失后可能出现的任何内容。
假设finalString
最初设置为“空”字符串,如适当长度的示例所示,您应该使用memcpy
。这将仅复制字符串中的字符,而不是添加空终止字节:
memcpy(&text[printSpot], part, strlen(part));
您还希望使用finalString
个字符填充'-'
:
char* finalString = malloc(stringSize + 1);
memset(finalString, '-', stringSize);
finalString[stringSize]=0;
输出:
This is a ----------------------------------------
This is a test with ------------------------------
This is a test with something --------------------
This is a test with something that i wro----------
This is a test with something that i wrote in it--