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

Cannot sort command line arguments using strcpy

我是 C/C++ 的新手,正在学习命令行参数。我正在尝试使用 strcpy 对我的命令行参数进行排序,但是它给了我错误的输出。 例如


i/p : 我是


o/p : 朋友 我

任何人都可以帮助我解决我在这里做错了什么吗?请注意:我只是 运行 这个程序,只有 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;
}

考虑一下你的内存布局。当你运行$ ./a.out i am,程序启动时会是这样:

a   .   o  u  t  [=10=] i  [=10=] a  m  [=10=]
^                   ^     ^
argv[0]          argv[1]  argv[2]

在您的交换过程中写入 argv[1] 会将其更改为:

a   .   o  u  t  [=11=] a  m  [=11=] m  [=11=]
^                   ^     ^
argv[0]          argv[1]  argv[2]

然后写入 argv[2] 将再次更改为:

a   .   o  u  t  [=12=] a  m  i  [=12=] [=12=]
^                   ^     ^
argv[0]          argv[1]  argv[2]

所以当你打印出 argv[1] 时,它会读取到空字节,给你 amiargv[2] 将从不同的起点阅读,给你 i.

正如 Galik 指出的那样,这是因为 argv[1]argv[2] 不是某种自动调整大小的缓冲区。它们只是指向内存的指针。在这一点上我应该注意,确切的布局并没有由语言正式定义;根据您使用的平台,您可能会遇到各种不同的不可预测的行为。

要解决此问题,您应该创建一个指向要排序的字符串的指针数组,并交换指针而不是字符串的值。这将更快(需要复制的字节更少)和更安全(意外溢出缓冲区的方式更少,如果您的输入之一超过 100 个字符,您当前的代码就会发生这种情况)。