【问题标题】:splitting one line into two when creating a Text Editor创建文本编辑器时将一行一分为二
【发布时间】: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


【解决方案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 上下文也被初始化为 Document 的第 loc.line_no-th 行。

现在阅读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';

将从loc.idx-th 索引处开始的origLine 的子字符串的第一个strlen(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,出于安全原因。

【讨论】:

    猜你喜欢
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多