【发布时间】:2017-09-11 07:26:22
【问题描述】:
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.line_no”行拆分为两部分,但我很难遵循代码,尤其是从第四行开始功能。请帮助我了解每一行代码的作用。
【问题讨论】:
-
只有一个函数你应该学会理解这段代码,那就是strncpy。你读过它的作用吗?它是标准 C 库函数。请注意,将 '\0' 分配给 char 数组的末尾是使其成为以空字符结尾的字符串 - 使其适用于所有字符串操作函数。
-
第四/第五和第六/第七行对将分割文本的两部分复制到临时位置。每对的第一行使用函数
strncpy来防止缓冲区溢出。每对中的第二个写入一个预防性字符串终止符'\0',因为strncpy并不总是这样做。然后分割线的第一部分替换文本文档中的现有行,第二部分作为新的文本行插入。那么临时存储就是freed。
标签: c arrays string function memory-management