2017-09-14 288 views
0

命令行参数排序,我是相当新的C/C++和我学习的命令行参数。我正尝试使用strcpy对我的命令行参数进行排序,但是它给了我不好的输出。 例如不能使用的strcpy


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; 
} 
+0

的命令行参数的大小,所以你不能复制他们周围像(除非他们都碰巧是相同的长度)不会自动改变。 – Galik

+0

@CroCo我首先比较了字符串和基于我交换/排序。 – siddyi

+0

@Galik那么我怎样才能排序可变长度的参数? – siddyi

回答

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]不是某种自动调整大小的缓冲区。它们只是指向记忆的指针。我现在应该注意到,确切的布局不是由语言正式定义的;您可能会根据您使用的平台获得各种不可预测的行为。

要解决这个问题,你应该建立一个指针数组,你排序的字符串和交换指针,而不是字符串值。这都将是更快(需要较少的字节被复制)和安全(较少的方式来不慎溢出的缓冲区,将在当前的代码发生,如果你输入一个长于100个字符)。

+0

谢谢,这绝对清除东西。编辑:不明白为什么这个答案是downvoted。我已经接受你的答案btw。 – siddyi

+2

请问为什么这是低票? – user3553031