我是C / C ++的新手,我正在学习命令行参数。我试图使用strcpy对我的命令行参数进行排序,但是它给了我糟糕的输出。 例如
我/我:我是
o / p:ami 我
任何人都可以帮我解决我在这里做错了什么吗?请注意:我只运行此程序仅用于argc = 3,我只运行此代码用于输入(将进行排序),如上例所示。 我刚刚删除了用于调试的循环。
#include "iostream"
#include "cstdlib"
#include "cstring"
using namespace std;
int main (int argc, char **argv)
{
char temp[100];
//sorting my command line arguments
if(strcmp(argv[1],argv[2])>0)
{
strcpy(temp,argv[1]);
strcpy(argv[1],argv[2]);
strcpy(argv[2],temp);
}
cout<<argv[1]<<endl;
cout<<argv[2]<<endl;
return 0;
}
答案 0 :(得分:1)
考虑你的记忆布局。运行$ ./a.out i am
时,程序启动时看起来像这样:
a . o u t \0 i \0 a m \0
^ ^ ^
argv[0] argv[1] argv[2]
在您的交换过程中写入argv[1]
会将其更改为:
a . o u t \0 a m \0 m \0
^ ^ ^
argv[0] argv[1] argv[2]
然后写入argv[2]
会再次将其更改为:
a . o u t \0 a m i \0 \0
^ ^ ^
argv[0] argv[1] argv[2]
因此,当您打印出argv[1]
时,它会一直读到空字节,并为您提供ami
。 argv[2]
将从不同的起点读取,为您提供i
。
正如Galik所指出的那样,这是因为argv[1]
和argv[2]
不是某种自动调整大小的缓冲区。他们只是指向内存的指针。在这一点上我应该注意到语言没有正式定义确切的布局;根据您使用的平台,您可以获得各种不同的不可预测行为。
要解决此问题,您应该创建一个指向字符串的指针数组,这些字符串是您排序和交换指针而不是字符串&#39;值。这将更快(需要更少的字节被复制)和更安全(更少的方法意外溢出缓冲区,如果您的一个输入超过100个字符,将在当前代码中发生)。