使用main的问题(int argc,char * argv [])

时间:2013-04-10 02:26:06

标签: c main argv

#include<stdio.h>
#include<string.h>
int main(int argc,char *argv[])
{
    char string[]="#";
    printf("%s\n",argv[1]);
    printf("%s\n",argv[2]);
    printf("%s\n",argv[3]);
    strcat(argv[1],string);
    printf("argv[1] is %s\n",argv[1]);
    printf("argv[2] is %s\n",argv[2]);
    printf("argv[3] is %s\n",argv[3]);
    return 0;
}

当我使用strcat()向argv [1]的末尾添加内容时,argv [2]将丢失(strlen(argv [2])在使用strcat后更改为0)。但是argv [3]没有变化。为什么???

3 个答案:

答案 0 :(得分:2)

请记住,C中的“字符串”是零终止的字符数组。假设原来的四个论点是“一”,“二”,“三”和“四”;然后这四个参数作为

存储在内存中
one\0two\0three\0four\0

当你在argv [1]之后追加#(strcat也会添加一个\ 0)时,内存内容变为:

one\0two#\0hree\0four\0

你现在可以验证argv [2]指向\ 0 char,因此它是一个空字符串。 argv [3]仍然正确指出,它仍然完好无损。

答案 1 :(得分:2)

您无法将内容直接附加到argv[],因为每个argv[]都已分配序列化,并且内存空间只能保留其原始大小。

要了解发生了什么,想象argv是这样的:

char buffer[] = "./program\0one\0two\0three\0";
char *argv[4] = { &buffer[0], &buffer[10], &buffer[14], &buffer[18] };

正如你所看到的,如果你在"one"之后写一些东西,你将覆盖"two"并打破整个事情,因为它们在内存中被序列化。

要解决此问题,您必须将每个argv[]复制到更大的缓冲区,以便安全地进行修改。例如:

char buf[1024];
strcpy(buf, argv[1]);
strcat(buf, string);
printf("argv[1] is %s\n", buf);

答案 2 :(得分:0)

您不应该修改argv [] =效果未定义