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

时间:2017-09-11 07:26:22

标签: c arrays string function memory-management

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;

}

此代码用于将'loc.idx'字符中'loc'中的'loc.line_no'th行拆分为两部分,但我很难跟踪代码,特别是从第四行开始功能。请帮助我按照代码的每一行进行操作。

1 个答案:

答案 0 :(得分:1)

下面:

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上下文也初始化为文档的loc.line_no行。

现在阅读strncpy(),然后继续。

newLine = strncpy(newLine, origLine, loc.idx);会将origLine的第一个loc.idx字符复制到newLine。

newLine[loc.idx] = '\0'; null - 终止字符串newLine。

同样,这:

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

会将strlen(origLine)-loc.idx子字符串的第一个origLine字符从loc.idx索引处复制到nextLine

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

这些:

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;

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