C++ 无法使用strcpy对命令行参数进行排序
我是C/C++的新手,正在学习命令行参数。我试图使用strcpy对我的命令行参数进行排序,但是它给了我糟糕的输出。 e、 gC++ 无法使用strcpy对命令行参数进行排序,c++,command-line-arguments,strcpy,C++,Command Line Arguments,Strcpy,我是C/C++的新手,正在学习命令行参数。我试图使用strcpy对我的命令行参数进行排序,但是它给了我糟糕的输出。 e、 g i/p:是的 o/p:ami 我 谁能帮我一下我做错了什么?请注意:我只为argc=3运行此程序,并且只为上面示例中列出的输入(将被排序)运行此代码。 我刚刚删除了用于调试的循环 #include "iostream" #include "cstdlib" #include "cstring" using namespace std; int main (int a
i/p:是的
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;
}
#包括“iostream”
#包括“cstdlib”
#包括“cstring”
使用名称空间std;
int main(int argc,字符**argv)
{
炭温度[100];
//排序我的命令行参数
如果(strcmp(argv[1],argv[2])>0)
{
strcpy(温度,argv[1]);
strcpy(argv[1],argv[2]);
strcpy(argv[2],温度);
}
考虑一下你的内存布局。当你运行$./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]
不是某种自动调整大小的缓冲区。它们只是指向内存的指针。我应该注意,在这一点上,语言并没有正式定义确切的布局;根据所使用的平台,可能会出现各种不同的不可预测的行为
要解决此问题,您应该创建指向正在排序的字符串的指针数组,并交换指针,而不是字符串的值。这将更快(需要复制的字节更少)和更安全(意外溢出缓冲区的方法更少,当前代码中如果有一个输入超过100个字符,就会发生这种情况)。命令行参数的大小不会自动更改,因此您不能像那样复制它们(除非它们恰好长度相同)@ CcROO我首先比较字符串,并基于我正在交换/排序。@ Galik然后我如何排序可变长度的参数?“相当新的C/C++”。你可以从两个中选择一个。在C++中,这是微不足道的。<代码>:STD::矢量ARGS(ARCC,ARC+AGV);如果(ARGS(1))谢谢,这确实澄清了问题。编辑:不明白为什么这个答案被否决。顺便说一句,我已经接受了你的答案。