2016-08-26 78 views
-5

嘿,我不明白爲什麼我的兩個輸入同時採取元素作爲輸入。我在TurboC編譯器GCC上試過這個代碼,但得到了同樣的錯誤。錯誤當輸入

#include <stdio.h> 


int menu(); 
void bubble_short(); 
void selection_short(); 

int main() 
{ 
    int ch,j,n,a[100]; 

    ch=menu(); 

    switch (ch) 
    { 
      case 1: 
        { 
         bubble_short(); 
         break; 
        } 
      case 2: 
        { 
         selection_short(); 
        } 
      default : 
        break; 
     } 
} 

void bubble_short() 
{ 
    int i,j,n,a[100]; 
    printf("Elements"); 
    scanf("%d",&n); 
    for (j=0; j<n;j++) 
    { 
     scanf("%d",&a[j]); 
    } 
    for (i=0;i<n;i++) 
    { 
     for (j=0;j<n-1-i;j++) 
     { 
      if (a[j]>a[j+1]) 
      { 
       a[j]=a[j]+a[j+1]; 
       a[j+1]=a[j]-a[j+1]; 
       a[j]=a[j]-a[j+1]; 
      } 
     } 
    } 

    printf("the sorted elements are :\n"); 
    for (i = 0; i < n; i++) 
    { 
     printf("%d\n",a[i]); 
    } 
} 


void selection_short() 
{ 
    int i,j,n,a[100],min; 
    printf("Elements"); 
    scanf("%d",&n); 
    for (i = 0; i <n-1; ++i) 
    { 
     min=i; 
     for (j = 1+i; i < n; ++i) 
     { 
      if(a[min]>a[j]) 
       min=j; 
     } 
     if(i!=min) 
     { 
      a[i]=a[i]+a[min]; 
      a[min]=a[i]-a[min];; 
      a[i]=a[i]-a[min];; 
     } 
    } 

    printf("the shorted elements are :\n"); 
    for (i = 0; i < n; ++i) 
    { 
     printf("%d\n",a[i]); 
    } 
} 

int menu() 
{ 
    int k; 
    printf("Enter the choice \n 1. bubble short \n 2. selectionshort"); 
    scanf("\n %d ",&k); 
    return k; 
} 

嘿,我不明白爲什麼我這是採取兩個輸入,而以元素作爲輸入。我在TurboC編譯器GCC上試過這個代碼,但得到了同樣的錯誤。

輸出

enter image description here

+1

'void bubble_short(int n)' - >'void bubble_short(void)' – BLUEPIXY

+0

這是什麼錯誤?據你解釋,你得到兩次相同的錯誤。你想讓我們去你的地方看看嗎?把它放在這裏並且讓我們讀它會更容易嗎? –

+0

我在這裏附上我的C文件。我不知道爲什麼scanf之前運行的比printf。我在此附上完整的代碼。執行後,它應該只需要一個輸入,它取2,最後一個是第二個scanf。 – akashmagrawal

回答

1

得到了您的問題!

切勿在scanf中使用換行符,空格,製表符和回車,以避免出現此類問題並保持良好的編碼準則!這些作爲它的分隔符,你已經提供了3個。

編輯您的菜單scanf的這個: -

scanf("%d",&k); 

其背後的基本邏輯: - 以一個簡單的例子: -

scanf("%d %d", &i, &j); 

注意,佔位空間之間的兩個。當你運行這個命令時,它會接受第一個輸入,然後等待從鍵盤讀取分隔符,之後它將讀取輸入的第二個參數。

我認爲程序的其餘部分應該運行良好。

+0

「謝謝」它爲我工作。感謝這背後的基本概念。 – akashmagrawal

+0

歡迎您:) –

1

menu()功能,您有:

scanf("\n %d ",&k); 

的前導空格字符('\n'' ')是不需要的;無論如何,%d跳過領先的白色空間,一個就足夠了。請注意,scanf()等的格式字符串中的每個空白字符都映射到輸入中的零個或多個空白字符。

尾隨白色空間不好。它意味着跳過零個或多個空格字符(換行符,空格,製表符),並繼續前進,直到看到不是空白字符的東西(或直到EOF)。在格式字符串中尾隨空格是一個壞主意 - 當輸入應該是交互式的時候是雙重的。您必須預測下一個輸入應該是什麼,然後才能終止當前輸入,這對人們來說並不容易。


還有其他許多問題。你的函數聲明不是原型(你必須編寫int menu(void);等,使它成爲C語言的原型)。在case 2:之後你錯過了一個休息時間 - 目前它恰好是無害的,但是當你在系統中輸入錯誤信息或其他排序選項時,它就成了一個問題。您沒有使用足夠的功能:您應該具有數組讀取功能和數組打印功能,並且應該使用它們。您已將數據讀取循環從selection_short()函數中刪除。通常,使用的術語是sort,而不是short - 功能名稱對於大多數人來說似乎是不正常的。

你交換算法是扭曲:

a[i]=a[i]+a[min]; 
a[min]=a[i]-a[min];; 
a[i]=a[i]-a[min];; 

你不需要雙分號。如果這些值足夠大,你就會冒着溢出的風險。所以,很簡單,而且更爲正統的 - 並最終安全 - 使用方法:

int tmp = a[i]; 
a[i] = a[min]; 
a[min] = tmp; 

你應該檢查每個scanf()通話,以確保它成功,採取適當的行動,如果它失敗。請注意,通過返回0EOF可能會失敗;你應該測試:

if (scanf("%d", &n) != 1) 
    …oops… 
+0

感謝Jonathan Leffer指出我的錯誤......我是初學者,我確信我會牢記您的觀點。 – akashmagrawal