2017-09-14 298 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