创建一个用零填充的特定维度的文件

时间:2018-03-09 15:45:32

标签: c string merge

我试图创建一个方法,给定多个字符串,将它们合并在一起。现在,这就是我提出的。主要是纯粹用于测试,所以最后我只有一个部分字符串,该部分属于完整字符串的位置,以及我需要放置这些部分的最终字符串。

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";

2 个答案:

答案 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--