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行拆分为两部分,但我很难跟踪代码,特别是从第四行开始功能。请帮助我按照代码的每一行进行操作。
答案 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。