c - 使用 memcpy 连接字符串时打印的奇怪字符

标签 c linux

我开发了这个功能:

bool execc(char *cmd, char *r)
{

    FILE *fp;
    char t1[1024];
    char *t2;
    memset(r, 0, sizeof(r));

    fp = popen(cmd, "r");
    if (fp == NULL)
    {
        return false;
    }
    t1 = r;

    while (fgets(t1, sizeof(t1), fp) != NULL)
    {
    r = &r[strlen(r)];
    memcpy(r, t1, strlen(t1));
    }
    r = t2;
    r[strlen(r)] = '\0';

    pclose(fp);

    return true;
}
int main()
{
    char r[4096];
    int i = 51;
    execc("ls -l /", r);
    printf("result of cmd: \n %s", r);
    return 0;
}

当我执行这个程序时,我得到了一些奇怪的字符,如下所示:

result of command: 
 total xxx
drwxr-xr-x   7   1001 root    4096 août  25 16:06 xxx
drwxr-xr-x   3 root   root    4096 juin  30 11:45 xxx
drwxr-xr-x   2 root   root   12288 oct.   9 15:26 bin
drwxr-xr-x   3 root   root    1024 août  28 11:48 boot
drwxr-xr-x   3 root   root    4096 août  26 10:51 boot-files
drwxrwxr-x   2 root   root    4096 janv. 12  2015 cdrom
drwxr-xr-x   7 xxxx xxxx  4096 juil. 14 16:43 data
drwxr-xr-x  20 root   root    4640 oct.  20 15:06 dev
drwxr-xr-x 174 root   root   12288 oct.   9 17:43 etc
drwxr-xr-x   5 root   root    4096 sept. 28 17:19 home
lrwxrwxrwx   1 root   root      33 août  26 10:50 initrd.img -> boot/initrd.img-xxxx-generic
lrwxrwxrwx   1 root   root      33 août  26 10:49 initrd.img.old -> boot/initrd.img-xxxx-generic
drwxr-xr-x  27 root   root    4096 avril 28 16:08 lib
drwxr-xr-x   2 root   root    4096 mai    7 17:35 lib32
drwxr-xr-x   2 root   root    4096 avril 28 15:33 lib64
drwx------   2 root   root   16384 janv. 12  2015 lost+found
drwxr-xr-x   3 root   root    4096 janv. 16  2015 media
drwxr-xr-x   2 root   root    4096 oct.  16  2014 mnt
drwxr-xr-x   7 root   root    4096 août  24 13:18 opt
dr-xr-xr-x 299 root   root       0 oct.  19 08:54 proc
drwx------  10 root   root    4096 oct.   5 18:03 root
drwxr-xr-x  27 root   root     940 oct.  20 14:38 run
drwxr-xr-x   2 root   root   12288 août  13 09:57 sbin
h�rwxr-xr-x   2 root   root    4096 oct.  22  2014 srv
dr-xr-xr-x  13 root   root       0 oct.  20 14:34 sys
drwxrwxrwx   2 nobody xxxx  4096 oct.  12 12:08 tftpboot
drwxrwxrwt  19 root   root   20480 oct.  20 15:30 tmp
drwxr-xr-x  12 root   root    4096 août  27 10:24 usr
drwxr-xr-x  14 root   root    4096 avril  7  2015 var
lrwxrwxrwx   1 root   root      30 août  26 10:46 vmlinuz -> boot/vmlinuz-xxxx-generic
3B�lrwxrwxrwx   1 root   root      30 août  13 10:01 vmlinuz.old -> boot/vmlinuz-xxxx-generic

如何解决这个错误?我没有找到问题

最佳答案

线

memcpy(r, t1, strlen(t1));

正在复制 t1 没有终止 \0。所以这一行:

r[strlen(r)] = '\0';

无效,因为 strlen(r) 不会返回正确的值,因为 r 未正确终止。

如果 r 区域用零填充到整个操作范围,它可以工作。但它不像

memset(r, 0, sizeof(r));

不会像您预期的那样工作。 sizeof(r) 只是一个指针大小,大概是几个字节。

关于c - 使用 memcpy 连接字符串时打印的奇怪字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33239705/

相关文章:

c - 分配大小错误或自由方法的错误使用?

c++ - g++优化选项影响sin函数的值

c - c中的奇异值分解简单代码

c++ - 从 Bash 命令行向函数传递参数

c - 使用通配符 ip 的套接字绑定(bind)

linux - systemd: "Environment"指令设置 PATH

c++ - 通过 Cortex-M3 访问 USB 网络摄像头

使用 GNU make 启用分析功能来编译包

linux - 如何使用scp复制文件而不覆盖目的地中的同名文件

c++ - 如何在 Qt 中执行复杂的 linux 命令?