Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法使用strcpy对命令行参数进行排序_C++_Command Line Arguments_Strcpy - Fatal编程技术网

C++ 无法使用strcpy对命令行参数进行排序

C++ 无法使用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

我是C/C++的新手,正在学习命令行参数。我试图使用strcpy对我的命令行参数进行排序,但是它给了我糟糕的输出。 e、 g


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))谢谢,这确实澄清了问题。编辑:不明白为什么这个答案被否决。顺便说一句,我已经接受了你的答案。