C 创建文本编辑器时将一行拆分为两行
此代码用于将“document”中“loc.idx”字符处的“loc.line\u no”行拆分为两部分,但我很难理解代码,尤其是函数的第四行。请帮助我了解每行代码的作用。此处: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
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;