使用main(int argc,char*argv[]时出现问题) #包括 #包括 int main(int argc,char*argv[]) { 字符字符串[]=“#”; printf(“%s\n”,argv[1]); printf(“%s\n”,argv[2]); printf(“%s\n”,argv[3]); strcat(argv[1],字符串); printf(“argv[1]是%s\n”,argv[1]); printf(“argv[2]是%s\n”,argv[2]); printf(“argv[3]是%s\n”,argv[3]); 返回0; }

使用main(int argc,char*argv[]时出现问题) #包括 #包括 int main(int argc,char*argv[]) { 字符字符串[]=“#”; printf(“%s\n”,argv[1]); printf(“%s\n”,argv[2]); printf(“%s\n”,argv[3]); strcat(argv[1],字符串); printf(“argv[1]是%s\n”,argv[1]); printf(“argv[2]是%s\n”,argv[2]); printf(“argv[3]是%s\n”,argv[3]); 返回0; },c,main,argv,C,Main,Argv,当我使用strcat()在argv[1]的末尾添加一些内容时,argv[2]将丢失(strlen(argv[2])在使用strcat后更改为0)。但是argv[3]没有更改。为什么??你不应该修改argv[]=效果未定义你不应该修改argv[]=效果未定义记住“字符串”在C语言中是以零结尾的字符数组。假设最初的四个参数是“一”、“二”、“三”和“四”;然后这四个参数存储在内存中作为 #include<stdio.h> #include<string.h> int main

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

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

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

记住“字符串”在C语言中是以零结尾的字符数组。假设最初的四个参数是“一”、“二”、“三”和“四”;然后这四个参数存储在内存中作为

#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;
}
当您在argv[1]后面附加#(strcat也将添加一个\0)时,内存内容变为:

one\0two\0three\0four\0
现在可以验证argv[2]是否指向\0字符,因此它是一个空字符串。argv[3]仍然正确指向,并且保持不变。

请记住,C中的“字符串”是以零结尾的字符数组。假设最初的四个参数是“一”、“二”、“三”和“四”;然后这四个参数存储在内存中作为

#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;
}
当您在argv[1]后面附加#(strcat也将添加一个\0)时,内存内容变为:

one\0two\0three\0four\0

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

您不能将内容直接附加到
argv[]
中,因为每个
argv[]
都被序列化分配到内存中只能保持其原始大小的空间

要理解正在发生的事情,想象一下
argv
是这样的:

one\0two#\0hree\0four\0
如您所见,如果您在
“一”
之后编写内容,您将覆盖
“二”
,并破坏整个内容,因为它们在内存中序列化

为了解决这个问题,您必须将每个
argv[]
复制到一个更大的缓冲区,在那里您可以安全地进行修改。例如:

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

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

要理解正在发生的事情,想象一下
argv
是这样的:

one\0two#\0hree\0four\0
如您所见,如果您在
“一”
之后编写内容,您将覆盖
“二”
,并破坏整个内容,因为它们在内存中序列化

为了解决这个问题,您必须将每个
argv[]
复制到一个更大的缓冲区,在那里您可以安全地进行修改。例如:

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

这段代码是做什么的?o.o'可能是重复的@Thomas这段代码只是为了用argv[]解决我的问题。它没有任何意义。这段代码是做什么的?o.o'可能是重复的@Thomas这段代码只是为了用argv[]解决我的问题。它没有任何意义。我也这么认为,但有什么参考吗?实际上,您可以修改argv[任何内容](指针)。修改指针指向的内容不太合乎犹太规范。@paxdiablo:那么,它是否像
char const*argv[]
?不,它不一定是常量-标准没有说明它必须是什么。只是内存不是你的,所以你不应该更改它。我也这么认为,但是有任何参考吗?实际上,你可以修改
argv[任何]
(指针)。修改指针指向的内容不太合乎犹太规范。@paxdiablo:那么,它是否像
char const*argv[]
?不,它不一定是常量-标准没有说明它必须是什么。只是记忆不是你的,所以你不应该改变它。