2014-03-05 128 views
1

我在while循環中遇到了EOF問題。它似乎並沒有簡單地結束時EOF進入,而是這樣做...C while循環無限循環EOF不起作用

我該如何解決它,並有while循環停下來繼續前進。謝謝。

#define _CRT_SECURE_NO_WARNINGS 
    #include <stdio.h> 
    #include <limits.h> 

    void findLargestandSmallest(int integer, int* largest, int* smallest, int* average, int count); 

    int main(void) 
    { 
     //Local Declaration 
     int integer; 
     int largest; 
     int smallest; 
     int average; 
     int count; // number count 

     //Starting statemnets 
     smallest = INT_MAX; 
     largest = INT_MIN; 
     count = 0; 

     // Starting prompts 
     printf("\nHello this program will take in intagers and print"); 
     printf("\nout the largest, smallest and avarage of integers"); 
     printf("\nenterd int."); 
     printf("\nPlease enter in a integer "); 

     while (scanf("%d", &integer) != EOF) 
     { 
      if (integer != EOF) 
      { 
       count++; 
       findLargestandSmallest(integer, &largest, &smallest, &average, count); 
      } 
      else 
      { 
       printf("\n \n"); 
      } 
     } 

     printf("\nThe largest number entered is %d and the smallest", largest); 
     printf("\nwas %d and the average of all the numbers is %d\n", smallest, average); 
     return 0; 
    } 

    void findLargestandSmallest(int integer, int *largest, int *smallest, int *average, int count) 
    { 
     int x; // just a holder variable 

     // finds average 
     x = 0; 
     x += integer; 
     *average = (x/count); 

     // Finds smallest and largest 
     if (integer <= *smallest) 
     { 
      *smallest = integer; 
     } 
     if (integer >= *largest) 
     { 
      *largest = integer; 
     } 
     printf("Enter another integer or <EOF> to quit "); 
     return; 
    } 


    [1]: http://i.stack.imgur.com/P0307.png 

更新:我發現我做錯了什麼。這很簡單。在while循環while(scanf("%d", &integer) != EOF)不要像那樣設置它,但是像這樣可以理解EOF的(scanf("%d", &integer))。要在DOS中簡單地調用它,請在上次輸入中使用「Ctrl + Z」。即「數字^ Z」是它使用「Ctrl + Z」後的樣子。對於遇到這個問題的其他人來說,這個問題也是更好的工作代碼。

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <limits.h> 

void findLargestandSmallest(int integer, int* largest, int* smallest); 

int main(void) 
{ 
    //Local Declaration 
    int integer; 
    int largest; 
    int smallest; 
    int average; 
    int sum; 
    int count; 

    //Starting statemnets 
    smallest = INT_MAX; 
    largest = INT_MIN; 
    count = 0; 
    sum = 0; 

    // Starting prompts 
    printf("\n--------------------------------------------------------"); 
    printf("\n- Hello, this program will take in intagers and print -"); 
    printf("\n- out the largest, smallest, and avarage of the  -"); 
    printf("\n- integers enterd.         -"); 
    printf("\n- NOTE: To quit: use \"Ctrl+Z\" on the last integer  -"); 
    printf("\n- you enter i.e \"number^z\"      -"); 
    printf("\n--------------------------------------------------------\n"); 
    printf("\nEnter integers\n"); 

    // Finds largest and smallest number 
    while (scanf("%d", &integer)) 
    { 
     sum += integer; 
     count++; 
     findLargestandSmallest(integer, &largest, &smallest); 
    } 

    // Finds average 
    count--; 
    average = (sum/count); 

    // End prompts 
    printf("\n--------------------------------------------------------"); 
    printf("\nThe largest number entered was %d, the smallest", largest); 
    printf("\nwas %d, and the average of all the numbers is %d.", smallest, average); 
    printf("\n--------------------------------------------------------"); 
    printf("\nGoodbye\n"); 
    return 0; 
} 

void findLargestandSmallest(int integer, int *largest, int *smallest) 
{ 
    if (integer < *smallest) 
    { 
     *smallest = integer; 
    } 
    if (integer > *largest) 
    { 
     *largest = integer; 
    } 
    return; 
} 
+0

'的printf(「輸入另一個整數或退出」);'應在while循環的結束,而不是在'findLargestandSmallest'函數的末尾。 –

+1

你如何導致'EOF'?通過輸入「EOF」,Ctrl-D或其他東西? – chux

回答

0

更新:我發現我在做什麼錯。這很簡單。在while循環while(scanf(「%d」,& integer)!= EOF)不要這樣設置,但是像這樣(scanf(「%d」,& integer))EOF被理解。要在DOS中簡單地調用它,請在上次輸入中使用「Ctrl + Z」。即「數字^ Z」是它使用「Ctrl + Z」後的樣子。對於遇到這個問題的其他人來說,這個問題也是更好的工作代碼。

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <limits.h> 

void findLargestandSmallest(int integer, int* largest, int* smallest); 

int main(void) 
{ 
    //Local Declaration 
    int integer; 
    int largest; 
    int smallest; 
    int average; 
    int sum; 
    int count; 

    //Starting statemnets 
    smallest = INT_MAX; 
    largest = INT_MIN; 
    count = 0; 
    sum = 0; 

    // Starting prompts 
    printf("\n--------------------------------------------------------"); 
    printf("\n- Hello, this program will take in intagers and print -"); 
    printf("\n- out the largest, smallest, and avarage of the  -"); 
    printf("\n- integers enterd.         -"); 
    printf("\n- NOTE: To quit: use \"Ctrl+Z\" on the last integer  -"); 
    printf("\n- you enter i.e \"number^z\"      -"); 
    printf("\n--------------------------------------------------------\n"); 
    printf("\nEnter integers\n"); 

    // Finds largest and smallest number 
    while (scanf("%d", &integer)) 
    { 
     sum += integer; 
     count++; 
     findLargestandSmallest(integer, &largest, &smallest); 
    } 

    // Finds average 
    count--; 
    average = (sum/count); 

    // End prompts 
    printf("\n--------------------------------------------------------"); 
    printf("\nThe largest number entered was %d, the smallest", largest); 
    printf("\nwas %d, and the average of all the numbers is %d.", smallest, average); 
    printf("\n--------------------------------------------------------"); 
    printf("\nGoodbye\n"); 
    return 0; 
} 

void findLargestandSmallest(int integer, int *largest, int *smallest) 
{ 
    if (integer < *smallest) 
    { 
     *smallest = integer; 
    } 
    if (integer > *largest) 
    { 
     *largest = integer; 
    } 
    return; 
} 
1

scanf返回成功轉換的元素數量。如果無法轉換,則返回0. EOF僅返回文件結尾(在Un​​ix上是Control-D)。

所以你應該修改程序來保存scanf的返回值,然後分別測試0和EOF

這也是沒有意義的integer變量與EOF比較,因爲所有你所能知道的EOF是,它是一個負整數。閱讀scanf手冊頁,瞭解它的作用以及它在何時何地返回的內容。這將解決這個難題。 :-)

好的,還有一些提示。你能理解這個嗎?

for (;;) { 
    int successfully_converted = scanf("%d", &integer); 

    if (successfully_converted == EOF) { 
     /* Do something when the user is tired of typing. */ 
     puts("Thank you for an enjoyable game.\n"); 
     exit(0); 
    } else if (successfully_converted == 0) { 
     puts("This didn't look like an integer\n"); 
     exit(1); 
    } else { 
     /* Do something with integer. */ 
    } 
} 
+0

特別是,你似乎沒有做任何事情來跳過數字之間存在的空格 - 所以你掃描第一個數字,然後每個scanf()返回0,因爲它不能掃描數字下一個字符是一個空格或換行,並且0從不匹配'EOF',所以你有一個無限循環... – twalberg

+0

那麼它不完全理解如何做到這一點......我也想輸入的值之一在scnaf是0. 我仍然得到一般和計算機編程的竅門。你能否試着詳細解釋你的解釋? –

+0

@twalberg'scanf(「%d」...'跳過前導空白,跳過空白不是OP的問題 – chux

0

您沒有將整數值與EOF 進行比較。您正在比較scanf結果和EOF。 這裏,當您每次輸入1個值時,scanf結果將爲1.

因此evrrytime while循環條件失敗並生成無限循環。 另外,如果你是EOF,那麼你會輸入什麼字符來結束循環? 因此不應使用EOF。

所以我建議你使用do while循環

{

的scanf( 「%d」,&整數);

....

... 的printf( 「請輸入1,繼續」);

scanf(「%d」,&檢查);

} while(check == 1);

+0

仍然做一些如何.... –

+0

我有一個疑問。爲什麼你使用EOF ???什麼你會輸入字符來結束循環嗎?所以這可能是一個原因.... – user3256147

+0

根據以上評論編輯了我的解決方案..請檢查 – user3256147

0

測試scanf()對EOF,0的結果,1

int cnt; 
while ((cnt = scanf("%d", &integer)) == 1) { 
    count++; 
    findLargestandSmallest(integer, &largest, &smallest, &average, count); 
} 
if (cnt == 0) { 
    printf("Something other than an integer was entered.\n"); 
} 
else if (cnt == EOF) { 
    printf("EOF or I/O Error occurred.\n"); 
} 
// Add the following for debug if desired 
else { 
    printf("Should _never get here!\n"); 
} 
...