不确定在这种情况下strcpy是如何工作的

时间:2017-06-16 10:46:45

标签: c strcpy

我是C的新手并且通过一个项目来帮助激励我学习。我很难从sh popen获得输出。经过大量的搜索和数小时的试用后,我偶然发现了一个非常古老的帖子,他们使用了

strcpy(str + size - 1,buf);

这是我能找到的第一个也是唯一的例子,它正在发挥作用。它看起来像是用buf中的内容覆盖str末尾的终止字符。这样安全吗?我还没有完全掌握它如何存储所有这些数据,并且最终将该数字更改为高于+2的任何值导致分段错误或下一个大小无效。完整代码位于

之下
int dns_probe(char * hostname)
{
    char * digLoop[4] = {"ns ","a ","cname ","mx "};
    int i;
    char outage[1];
    char *str = NULL;
    char *temp = NULL;
    unsigned int size = 1;
    unsigned int strlength;

    for ( i = 0; i < 4; i++)
    {
        char *digcmd = concatCMD(digLoop[i],hostname);

        FILE * dig = popen(digcmd,"r");
        char bufer[256];
        while(fgets(buf,sizeof(buf),dig) != 0){

            strlength = strlen(buf);

            temp = realloc(str, size + strlength);
            str = temp;

            strcpy(str + size - 1,buf);
            size += strlength;
        }

       pclose(dig);
       free(digcmd);

    }
    printf("%s",str);
}

真的只是想确保我不会在未来遇到问题。

2 个答案:

答案 0 :(得分:2)

是的,只要vuejs-datepicker确保缓冲区足够大(确实如此),这是安全的。

在您realloc()之前:

realloc()

然后让我们假设 +---+---+---+----+ buf: | f | o | o | \0 | size=4 +---+---+---+----+ 被读取,以便:

"bar"

然后strlength = strlen("bar") = 3 将为temp长度为4 + 3 = 7:

realloc()

然后 +---+---+---+----+---+---+---+ temp: | f | o | o | \0 | ? | ? | ? | +---+---+---+----+---+---+---+ 设置为buf(应该temp - 检查此处,顺便说一句。)

最后我们NULL strcpy()改为"bar",即buf + 4 - 1

buf[3]

显然,此缓冲区与之前的大小相同,并且未触及缓冲区外的任何字符。

答案 1 :(得分:0)

$Topic::hydrate($result);

//将buf的str重新分配给length(size + strlength),然后将更多的字节写入这个新分配的字节。初始长度为1,str的缓冲区在这里是安全的。 但是,强烈建议使用strcpy,这样更安全。

在这里,https://www.tutorialspoint.com/c_standard_library/c_function_strcpy.htm你可以找到一些简单的研究案例。