2013-05-08 48 views
0

我必須使用Bubble Sort技術按字典順序排序字符串,而不使用任何庫函數。我寫了下面的代碼在排序字符串時工作正常。

但問題是,如果我給Ñ作爲輸入(比如N = 4),I只能輸入n-1個字符串(僅3個字符串)。 該問題可以通過運行for循環從0到n來解決,但這不是一個合理的解決方案。

我在這裏做錯了什麼?C:字符串數組 - 只能輸入n-1個字符串,輸入大小爲n

#include <stdio.h> 
#include <string.h> 
#include <malloc.h> 
void swap(int indx[], int j) 
{ 
    int temp; 
    temp = indx[j]; 
    indx[j] = indx[j+1]; 
    indx[j+1] = temp; 
} 
void sort(char **str, int indx[], int n) 
{ 
    int i, j, k; 
    for(i=0; i<n; i++) 
    { 
     for(j=0; j<n-i-1; j++) 
     { 
      k = 0; 
      while(str[j][k] != '\0') 
      { 
       if((str[indx[j]][k]) > (str[indx[j+1]][k])) 
       { 
        swap(indx, j); 
        break; 
       } 
       else if((str[indx[j]][k]) < (str[indx[j+1]][k])) 
        break; 
       else 
        k++; 
      } 
     } 
    } 
} 
void display(char **str, int indx[], int n) 
{ 
    int i; 
    printf("Sorted strings : "); 
    for(i=0; i<n; i++) 
     printf("%s\n", str[indx[i]]); 
} 
int main(void) 
{ 
    char **str; 
    int n, i, j, *indx; 
    printf("Enter no. of strings : "); 
    scanf("%d", &n); 
    str = (char **) malloc (n * (sizeof(char *))); 
    indx = (int *) malloc (n * sizeof(int)); 
    for(i=0; i<n; i++) 
     str[i] = (char *)malloc(10 * sizeof(char)); 
    printf("Enter the strings : "); 
    for(i=0; i<n; i++) 
    { 
     gets(str[i]); 
     indx[i] = i; 
    } 
    sort(str, indx, n); 
    display(str, indx, n); 
} 
+0

我不明白... 1)爲什麼你只輸入n-1字符串?你沒有說出什麼問題。 2)爲什麼從0到n運行循環是「不合邏輯的」? – 2013-05-08 15:33:18

+0

注意:C標準說''malloc()'在''(不是'')中聲明;它也不會談論任何名爲''的頭文件。 – pmg 2013-05-08 15:34:36

+0

@KScottPiel爲了回答你的第一個問題,我們以這個例子爲例,如果我給「輸入字符串數」4,那麼我實際上只能輸入3個字符串。 要回答你的第二個問題,如果我們從0開始數組索引,我們通常會達到n-1。所以如果我們遍歷從0到n的數組,我們實際上遍歷了一個額外的元素,這根據我的知識是不合邏輯的。 – titan7585 2013-05-08 15:39:56

回答

3

問題是您使用scanf()。當您執行scanf("%d", &n)時,scanf()函數將讀取輸入直到找到一個整數,並將該值存入n。但是,當您輸入該整數時,您不僅輸入'4',而且輸入'4'並按Enter鍵。換行符仍然在輸入緩衝區中。另一方面,gets()函數讀取的輸入高達,包括第一個換行符,並且換行符被丟棄。所以,當你讀取輸入字符串時,獲取gets()的讀數將讀取換行符,並立即返回。然後,你進入由第二呼叫gets()閱讀第一串...

順便說一句,gets()功能應該永遠,永遠,在任何情況下,曾經被用於實際的程序,因爲它不不允許你限制輸入。最好是使用fgets()fgets(str[i], BUFFERSIZE-1, stdin)

+0

目前我似乎無法找到參考,但我的回憶是C專家建議不要使用'scanf()'。建議的替代方法是使用'fgets()'讀取一行輸入,然後在其上使用'sscanf()'。 – 2013-05-08 15:57:50

+0

由於我在輸入每個字符串後按下Enter,fgets()將在每個字符串輸入後採用所有換行符。說實話,我對sscanf()語法並不熟悉。 – titan7585 2013-05-08 16:18:14

+0

是的,'fgets()'複製換行符,不像'gets()'丟棄它。在每個字符串的末尾找到'\ n'並在其上寫入0應該相當簡單。 (其他問題:如果輸入行太長,緩衝區將不會以空終止) – 2013-05-08 16:30:56

0
int main(void) 
{ 
char **str; 
int n=4, i, j, *indx; 
printf("Enter no. of strings : "); 
//scanf("%d", &n); 
str = (char **) malloc (n * (sizeof(char *))); 
indx = (int *) malloc (n * sizeof(int)); 
for(i=0; i<n; i++) 
    str[i] = (char *)malloc(10 * sizeof(char)); 
printf("Enter the strings : "); 
for(i=0; i<n; i++) 
{ 
    gets(str[i]); 
    indx[i] = i; 
} 
sort(str, indx, n); 
display(str, indx, n); 
} 

//如果我註釋掉scanf函數,並給INT它的作品的價值優良// 所以問題只是scanf函數後用fgets作爲scanf函數留在緩衝區中的換行符//所以之前使用它使用fgets

+0

是的,通過使用'scanf()'中的newline,然後檢查'fgets()'中的換行符來設法獲得解決方案。 – titan7585 2013-05-08 16:40:07

0

在必須輸入字符串的行上嘗試此操作。相反的:

gets(str[i]); 

類型:

scanf("%s",str[i]);