【问题标题】:strncpy append 1 extra(weird or random)charstrncpy 附加 1 个额外(奇怪或随机)字符
【发布时间】:2013-03-05 16:45:06
【问题描述】:

我写了一个简单的c程序,只取一个单词的前两个字符,取第二个单词的后三个字符。我使用 strncpy 仅将 name1 的前 2 个字母复制到 name,并与 name2 的最后三个字符连接。

但是,当我运行它时。输出会以某种方式喜欢

Ediacy //correct

acy  //wrong

Ed?
acy  //wrong

Edk
   acy //wrong

Edv
   acy //wrong

// code sample
#include <stdio.h>
#include <string.h>

int main(void)
{
    char name[100];

    char name1[] = "Edison";
    char *name2 = "Tracy";

    strncpy(name, name1, 2); // instead of get Ed, it tried to append one extra char behind it.
    strcat(name, name2+2);

    printf("%s\n", name);

    return 0; 
}

如果有人帮我弄清楚为什么会这样以及我该如何纠正它,我将不胜感激?

【问题讨论】:

    标签: c substring concatenation strncpy


    【解决方案1】:

    strncpy 如果尺寸太小,则不会添加 nul 终止符。

    试试这个:

    strncpy(name, name1, 2);
    name[2] = '\0';
    

    【讨论】:

    • +1 它总是写入N字符,其中N是第三个参数。如果源字符串小于 N 个字符,它将用空字符填充到 N。 (当然,前提是实现符合标准)。
    • 请记住,同样的规则也适用于 fgets() 和类似的函数。
    • @none 哪个规则? fgets(buffer, size, stream) 总是 0-终止 buffer,如果遇到 '\n' 或之前的输入结束,则从 stream 读取的字符少于 size - 1
    • 阅读您的答案并尝试过。你说得对。我对此感到惊讶,因为我的参考手册准确地说 fgets() 没有在每个字符串上放置一个 '\0' 字符。抱歉我的错误,Pubby。
    猜你喜欢
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 2020-04-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多