2015-04-23 33 views
2

我在argv中丟失了字符串,我想對它進行排序。我正在用strcmp和strcpy進行排序。從argv排序的值

如何將const char **轉換爲可在我的排序函數中使用的char數組?

void sort(const char** sl, int n) { 

    char s[n][20], t[20]; 
    int i, j; 

    for (i = 1; i < n; i++) { 
     for (j = 1; j < n; j++) { 
     if (strcmp(s[j - 1], s[j]) > 0) { 
      strcpy(t, s[j - 1]); 
      strcpy(s[j - 1], s[j]); 
      strcpy(s[j], t); 
     } 
     } 
    } 

    printf("\nStrings in order are : "); 
    for (i = 0; i < n; i++) 
     printf("\n%s", s[i]); 

} 

int main(int argc, const char** argv) 
{ 
    sort(argv+1, argc-1); 
    printf("Files: %i\n", argc-1); 
    return 0; 
} 
+0

你有[*未定義行爲*](http://en.wikipedia.org/wiki/Undefined_behavior),因爲你比較了's1'中的字符串和* uninitialized *數組''[j]'。 –

+0

我還沒有比較任何東西,因爲我不知道如何從const char **轉換爲char [] ... – Merl

+0

'sort'中有'strcmp(s [j - 1],s [ j])',當你第一次調用函數'[j]'時會被初始化,導致UB。 –

回答

1

您可以使用標準qsort函數實現您想要的功能。

代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int string_cmp(const void *a, const void *b) 
{ 
    const char **ia = (const char **)a; 
    const char **ib = (const char **)b; 
    return strcmp(*ia, *ib); 
} 

void print_args(int argc, char** argv) { 
    int i = 0; 
    for(i = 0; i < argc; ++i) { 
     printf("%s\n", argv[i]); 
    } 
} 

int main(int argc, char** argv) { 
    printf("original:\n"); 
    print_args(argc, argv); 

    qsort(argv, argc, sizeof(char *), string_cmp); 

    printf("sorted:\n"); 
    print_args(argc, argv); 
    return EXIT_SUCCESS; 
} 

測試:

$ ./String-Sort 432 123456 bhello ahello ch 

輸出:

original: 
./String-Sort 
432 
123456 
bhello 
ahello 
ch 
sorted: 
./String-Sort 
123456 
432 
ahello 
bhello 
ch 

但是,如果仍然希望自己的函數你只需要初始化數組s,這樣

for(i = 0; i < n; ++i) { 
    strcpy(s[i], sl[i]); 
} 

您的排序循環之前添加此。但是你需要確保每個輸入字符串的長度小於20,或者你需要爲字符串分配更多的內存。

+0

非常感謝,但它不起作用,因爲我需要排序的字符串就像這樣a.1 a.2 a.3 a.4 - a.10,它總是像a一樣排序。 1 a.10 a.2 .... – Merl

+0

@Merl多數民衆贊成如何''strcmp''工作,與你的方法,你仍然會收到這樣的結果。使用''strverscmp''來實現正確的編號比較。 – NikolayKondratyev