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


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

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

不能直接向argv[]添加内容,因为每个argv[]都是序列化分配的,并且只能保存其原始大小。

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

char buffer[] = "./programonetwothree";
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 %sn", buf);

请记住,C语言中的"string "是终止于零的字符数组。假设最初的四个参数是"一"、"二"、"三"one_answers"四";然后这四个参数以

的形式存储在内存中。
onetwothreefour

当你在argv[1]后面加上#时(strcat也会加上),内存内容变成:

onetwo#hreefour

现在可以验证argv[2]指向字符,因此它是一个空字符串。Argv[3]仍然指向正确,并且保持完整。

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

相关内容

  • 没有找到相关文章

最新更新