无法使用strcpy

时间:2017-09-14 02:50:43

标签: c++ command-line-arguments strcpy

我是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;
}

1 个答案:

答案 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]时,它会一直读到空字节,并为您提供amiargv[2]将从不同的起点读取,为您提供i

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

要解决此问题,您应该创建一个指向字符串的指针数组,这些字符串是您排序和交换指针而不是字符串&#39;值。这将更快(需要更少的字节被复制)和更安全(更少的方法意外溢出缓冲区,如果您的一个输入超过100个字符,将在当前代码中发生)。