2017-11-25 187 views
-4

我是編程的初學者,現在我的講座都是關於指針的主題。我應該從鍵盤輸入字符串(最多40),然後按字母順序排序。使用指針對字符串進行排序

要求輸入應該在輸入「空」字符串時立即中斷,指向字符串的指針應該存儲在數組中,排序時我應該將指針移動到字符串,我應該使用strcmp函數。

我盯着寫我的代碼,想問你我是否在正確的軌道上。我被建議將字符串存儲在二維char數組中,但問題是即使我輸入空行(我認爲應該只按Enter),程序仍會詢問輸入。其次,我想問你關於排序字符串的最佳算法,因爲我沒有完全排序的經驗。

編輯我在我的代碼中做了一些改變,它給出了我期望的輸出,按字母順序對字符串進行排序。但是,如果我的代碼中有任何重大缺陷,並且可能會做出一些改進,我會非常感謝C中更有經驗的人的意見。在部分我不明白一個指針被分配了一個地址,但是我創建指針數組的方式真的是最有效的嗎?我知道我可以使用malloc,但我想像我一樣使用2D陣列。

int count = 0; 
char arr[40][100]; 
char (*poi[40])[100]; //Is the array of pointers declared right? 

for (int i = 0; i < 40; i++) 
{ 
    fgets(arr[i], 101, stdin); 
    count++; 
    if (strcmp(arr[i], "\n") == 0) 
    { 
     break; 
    } 
} 

printf("\n"); 

for(int i = 0; i < count; i++) 
{ 
    poi[i] = &arr[i]; //I don't really understand how this part works, seems to work though 
} 

for(int i = 0; i < count - 1; i++) 
{ 
    for(int j = i + 1; j < count; j++) 
    { 
     if(strcmp(*poi[i], *poi[j]) > 0) //if I type here strcmp(arr[i], arr[j]) the output is not sorted properly, why? 
     { 
      char (*temp)[100] = poi[i]; 
      poi[i] = poi[j]; 
      poi[j] = temp; 

     } 
    } 
} 


//returns sorted strings  
for (int i = 0; i < count; i++) 
{ 
    printf("%s", *poi[i]); 
} 
+7

第一步是確定您需要使用哪種編程語言編寫代碼。 – juanchopanza

+0

@juanchopanza沒有要求我的入門課程有「C」和「C++」兩個元素。我會很感激一個建議。 – Theta

+1

C++,'std :: string','std :: sort'。 – juanchopanza

回答

0

它看起來像我混淆了C和C++的方式,可能無法正常工作,儘管我不確定。如果你使用的是二維字符數組,那麼它聽起來像你應該使用較低級別的C範例。在這種情況下,我將停止使用cincout並切換到使用scanfprintf功能系列<stdio.h>。如果你應該使用strcmp那麼這絕對聽起來像你應該去的路線。

至於排序,如果您使用C,那麼看看<stdlib.h>中的qsort函數,如果您允許使用它。

+0

你能告訴我如何用'scanf'將字符串輸入到這樣的數組中嗎?我似乎遇到了問題。 – Theta

+0

問候,@Theta。我知道如何使用'scanf'將字符串輸入到這樣一個數組中,就像手冊一樣(作爲一名C程序員,您應該閱讀它,因此Michaels建議您閱讀它),並且因爲之前已經提出過這個問題(數百次,可能數千次),並且與這個問題無關,我認爲你不會在這裏找到任何人成爲你的百科全書。在你的教育中發揮更積極和獨立的作用。不要讓別人代表你學習/解釋。 – Sebivor

0

改爲使用std::cin.getline(arr[i], 100);並檢查字符串arr[i][0]的第一個字符爲'\ 0'。所以,你的循環應該是這樣的:

for (int i = 0; i < 40; i++) 
{ 
    std::cin.getline(arr[i], 100); 
    count++; 
    if (arr[i][0] == '\0') //working 
    { 
     break; 
    } 
} 
0

在學校的關鍵是學習,但你指出正確的方向...

Your loop 
for (int i = 0; i < 40; i++) 
{ 
    cin >> arr[i]; 

你的循環需要40個字符。返回角色不會被cin選爲角色。您必須添加空格或其他字符。

你在問什麼是排序字符串的最佳算法。這真的取決於很多事情,但是你可以從一個簡單的Bubble Sort開始,這可能接近你可能學到的東西。祝你好運。

http://www.geeksforgeeks.org/bubble-sort/

0

...但我創建的指針數組的方式真的是最有效的?

不,它甚至不是正確。在C兩者和C++編寫的陣列

  • 是元素
  • 連續的,未分段的序列具有大小等於乘以每個維度的元素數

但是,由於在您的代碼中多次致電malloc,因此這兩個標準的都被打破:

  • 沒有保證malloc將跨越多個呼叫分配要素的連續,不分段的序列
  • 你需要分配額外的字節在poi間接的第二級來表示指針(poi是40數組指針,每個指針可能指向數組40)。

在C語言中,如果你想要的東西,你可以大多使用像一個指針數組,你應該使用類似:

char (*poi)[40] = malloc(40 * sizeof *poi); 
// poi[39][39] = ... 

你也可以簡化這個使用typedef

typedef char array_of_40_char[40]; 
array_of_40_char *poi = malloc(40 * sizeof *poi); 

在C++中,你通常會遠離malloc,因爲有很多更清潔的選擇。爲了您的用例,你很可能被鼓勵使用類似:

std::vector<std::string &> *poi = new std::vector<std::string &>(); 

附:你有一個緩衝區溢出。您不應該嘗試將100個字符讀入只能存儲40個數組的數組中。

相關問題