gpt4 book ai didi

c - **argv 包含比预期更多的字符

转载 作者:太空宇宙 更新时间:2023-11-04 00:34:56 24 4
gpt4 key购买 nike

首先,我需要用 system() 执行两个命令,例如,我收到一个字符串并用文本编辑器打开这个字符串,如下所示:

$ ./myprogram string1

输出应该是这样的命令:

$ vim string1

但是,我找不到像这样的伪代码那样做的方法:

system("vim %s",argv[1]); //Error:

test.c:23:3: error: too many arguments to function 'system'
system("vim %s",argv[1]);

因此,我的解决方案是将 argv[1] 存储在已经用四个字符初始化的 char 数组中,如下所示:

char command[strlen(argv[1])+4];
command[0] = 'v'; command [1] = 'i'; command[2] = 'm'; command[3] = ' ';

并将 argv[1] 分配给我的新字符数组:

for(int i = 0; i < strlen(argv[1]) ; i++)
command[i+4] = argv[1][i];

最后:

system(command);

但是,如果提供给我程序的参数少于 3 个字符,它可以正常工作,但如果不是,输出中会出现一些我不希望出现的奇怪字符,如下所示:

./myprogramg 1234

输出是:

$ vim 12348�M�

我该如何解决这个错误,为什么会发生这种情况?

完整代码为:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (int argc,char **argv) {

char command[strlen(argv[1])+4];
command[0] = 'v'; command [1] = 'i'; command[2] = 'm'; command[3] = ' ';

for(int i = 0; i < strlen(argv[1]) ; i++)
command[i+4] = argv[1][i];

system(command);

return 0;
}

最佳答案

您需要 NUL 终止您的 C 风格字符串,这包括分配足够的内存来容纳 NUL

你的数组是一个字节短的(必须是 char command[strlen(argv[1])+4+1];NUL 留出空间),并且您可能应该只使用 sprintf 之类的东西来填写它,例如:

 sprintf(command, "vim %s", argv[1]);`

这比手动循环简单,而且它还为您填充了NUL

您看到的垃圾是由搜索 NUL 字节(终止字符串)引起的,该字节游离到恰好发生在缓冲区之后的不相关(并且未定义)内存中。

关于c - **argv 包含比预期更多的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48290855/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com