【问题标题】:C - using strchr inside memcpyC - 在 memcpy 中使用 strchr
【发布时间】:2016-05-14 00:31:06
【问题描述】:

我正在尝试制作一个简单的代码示例,其中我可以将一个子字符串转换为一个新字符串。

我的代码如下:

char titulo[20];
char line[] = "PRINCIPAL,1.Liga,2.Clubes,3.Jogadores,4.Relatorios,5.Sair;";
char *pos = strchr(line,',');

memcpy(titulo, line,*pos);

问题在于,当我这样做时:

printf("%s",titulo);

我得到类似的东西:

PRINCIPAL,1.Liga,2.Clubes,3.Jogadores,4.Rela

【问题讨论】:

  • 你认为将*pos 传递给memcpy 会怎样?
  • memcpy 将指向源缓冲区的指针作为第二个参数,将要复制的数据大小作为第三个参数。所以你传递了错误的参数。很可能你应该被编译器警告这一点。
  • titulo 是什么? m 是什么?你编译时启用了所有警告吗?
  • @RafaelBotas: char * pos 使 pos 成为指向 char 的指针。这使得*pos...成为charmemcpy() 会很高兴地将 char 的 ASCII 值——0x2c——解释为要复制的字节数。那是您在 titulo... 中看到的 44 个字符...并且由于 titulo 只有 place 20 个字符...您在“未定义行为”国家/地区 .如果您想要搜索字符串的','索引,则需要pos - line
  • @RafaelBotas:请先检查pos 是否有NULL,以防strchr() 找不到您要找的角色。 并且检查pos - line是否适合titulo在进行复制之前

标签: c string substring memcpy strchr


【解决方案1】:

因为你需要null终止titulo。示例

char line[] = "PRINCIPAL,1.Liga,2.Clubes,3.Jogadores,4.Relatorios,5.Sair;";
char *pointer = strchr(line, ',');
if (pointer != NULL)
{
    char *substr;
    size_t length;
    length = pointer - line;
    /* Perhaps check if `length == 0', but it doesn't matter
     * because you would end up with an empty but valid sub string
     * anyway.
     */
    substr = malloc(length + 1);
    if (substr != NULL)
    {
        memcpy(substr, line, length);
        substr[length] = '\0';
        /* Use `substr' here */
        printf("%s\n", substr);
        /* Don't forget to free */
        free(substr);
    }
}

【讨论】:

  • 应该是length = pointer - line + 1;,+1,因为数组是零索引的。
  • 这将包括分隔符,检查length == 0会更好。
  • 检查了你的答案,因为我缺少的是指针 - 线。就像我正在做的那样,不需要长度+1。你能告诉我你为什么使用malloc吗?我在寻找答案时看到了该参考资料,但没有意识到它的真正含义。
  • @RafaelBotas WARNING WARNING WARNING 我认为你不需要length + 1。如果您使用printf(),则子字符串必须null 终止。 malloc() 函数动态分配内存,我无法在评论中解释 malloc() 是什么,您需要阅读 c 中有关动态内存分配的信息。
  • 我没有使用结果来延长*子字符串的长度,所以我不需要将它与 malloc 一起使用或将长度加 1。但是因为我希望它是动态的,所以我会像你写的那样使用它。谢谢您的帮助。这是我第一次使用 StackOverflow,我不仅解决了我的问题,还向你学习。
猜你喜欢
  • 2017-01-29
  • 2020-05-11
  • 2015-09-22
  • 2016-03-29
  • 1970-01-01
  • 2016-07-05
  • 2017-06-11
  • 1970-01-01
  • 2014-04-24
相关资源
最近更新 更多