C 创建文本编辑器时将一行拆分为两行

C 创建文本编辑器时将一行拆分为两行,c,arrays,string,function,memory-management,C,Arrays,String,Function,Memory Management,此代码用于将“document”中“loc.idx”字符处的“loc.line\u no”行拆分为两部分,但我很难理解代码,尤其是函数的第四行。请帮助我了解每行代码的作用。此处: void splitLine(Document *document, location loc) { char* newLine = malloc(loc.idx * sizeof(char) + 1); char* origLine = strdup(Document_get_line(docume

此代码用于将“document”中“loc.idx”字符处的“loc.line\u no”行拆分为两部分,但我很难理解代码,尤其是函数的第四行。请帮助我了解每行代码的作用。

此处:

void splitLine(Document *document, location loc) {

    char* newLine = malloc(loc.idx * sizeof(char) + 1);
    char* origLine = strdup(Document_get_line(document, loc.line_no));
    char* nextLine = malloc((strlen(origLine)-loc.idx) * sizeof(char) + 1);

    newLine = strncpy(newLine, origLine, loc.idx);
    newLine[loc.idx] = '\0';

    nextLine = strncpy(nextLine, origLine+loc.idx, strlen(origLine)-loc.idx);
    nextLine[strlen(origLine)-loc.idx] = '\0';


    Document_set_line(document, loc.line_no, newLine);
    Document_insert_line(document, loc.line_no+1, nextLine);   

    free(newLine);
    free(nextLine);
    free(origLine);

    newLine = NULL;
    nextLine = NULL;
    origLine = NULL;

}
我们动态地分配了临时空间,我们的操作将在其中进行。请注意,
origLine
上下文也被初始化为文档的第

现在阅读,然后继续

newLine=strncpy(新行,原行,位置idx)
将把origLine的第一个
loc.idx
字符复制到换行符

newLine[loc.idx]='\0'
null终止字符串换行符

同样,这:

char* newLine = malloc(loc.idx * sizeof(char) + 1);
char* origLine = strdup(Document_get_line(document, loc.line_no));
char* nextLine = malloc((strlen(origLine)-loc.idx) * sizeof(char) + 1);
origLine
的子字符串的第一个
strlen(origLine)-loc.idx
字符复制到
nextLine

因此,这两部分将分割线的两部分复制到临时位置(仅在该函数内部有效)

这些:

nextLine = strncpy(nextLine, origLine+loc.idx, strlen(origLine)-loc.idx);
nextLine[strlen(origLine)-loc.idx] = '\0';
是自定义函数,此处未显示,但您可以猜到拆分行的第一部分将替换文档中的现有行,第二部分将作为新行插入下一行

本部分:

Document_set_line(document, loc.line_no, newLine);
Document_insert_line(document, loc.line_no+1, nextLine);  

用于取消分配已分配的动态内存
malloc()
strdup()
,然后出于安全原因将指针设置为NULL。

只有一个函数需要学习理解此代码,那就是strncpy。你读过它的功能吗?这是std C库函数。请注意,将“\0”指定给字符数组的结尾是为了使其成为以null结尾的字符串,以使其适用于所有字符串操作函数。第四行/第五行和第六行/第七行对将拆分文本的两部分复制到临时位置。每对的第一行使用防止缓冲区溢出的函数
strncpy
。每对中的第二个写入预防性字符串终止符
'\0'
,因为
strncpy
并不总是这样做。然后,拆分行的第一部分替换文本文档中的现有行,第二部分作为新文本行插入。然后,临时存储是免费的。
free(newLine);
free(nextLine);
free(origLine);

newLine = NULL;
nextLine = NULL;
origLine = NULL;