2014-10-20 72 views
0

我試圖創建一個函數,要求用戶輸入一個值,然後將該值存儲爲輸入的最大值或最小值,或者如果用戶輸入數字< 0,它將退出dataentry()函數,否則它將不斷詢問用戶輸入。C無限循環(如果嵌套在FOR LOOP中)

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

void dataentry(); 

int count = 0; 
float max, min, mean, old, new; 
float data; 
char Old[10],Data[10],choice[25]; 

int main(void) 
{ 
    dataentry(); 
} 

void dataentry() 
{ 
    printf(" |Enter Wind Speed Value:\n"); 
    printf("**|Enter -1 to exit data entry mode|**\n"); 

    fgets(Old, sizeof(Old), stdin); 
    sscanf(Old, "%f",&old); 

    max = old; 
    min = old; 
    data = 1; 
    count = 1; 

    printf("max=%f, min=%f, data=%f, count=%d.", max, min, data, count); 

    for (count == 1;data >= 0; count++) 
    { 
     printf("\nEnter data value: "); 

     //fgets(Data, sizeof(Data), stdin); // I commented this out because I got a coredump error with it in 
     sscanf(Data,"%f", &data); 
     if (data >= max) 
     { 
      max = data; 
     } 
     else if (data <= min && data > 0) 
     { 
      min = data; 
     } 
    } 
} 

程序提示後,您第一次輸入數據時,它到達for循環之前,它的工作原理,並輸入您的值。然後,它會一遍又一遍地打印出「輸入數據值:」的無限循環。我使用printf語句打印出最大值,最小值,數據和計數值,以便我可以檢查它們是否正在被存儲並且它們是,但是當函數進入for循環時,它不再執行我正在嘗試的操作做。預先感謝你,這個功能是我正在編寫的一個更大的程序的一部分,但我把所有不相關的東西都刪除了。

+0

「我評論了這一點,因爲我在其中得到了一個coredump錯誤」 - 並且讓自己陷入了一個情況,那就是你試圖從一個你從未初始化的char數組讀取數據,這不是進步。 – 2014-10-20 02:19:52

+0

看到這個,你需要在sscanf中添加「%n」。 http://stackoverflow.com/questions/3975236/how-to-use-sscanf-in-loops – oyss 2014-10-20 02:21:19

+0

你有一個sscanf讀取字符串中的值。 但是,您已將嘗試讀取的行註釋爲從stdin中將值讀入字符串。 修復該行而不是將其禁用。或者獲取數據的非負值_somewhere _... – keshlam 2014-10-20 02:22:25

回答

0

如果您取消註釋fgets()行,它應該工作。這裏有一個工作版本,整理了一點點,以檢查你是不是監視功能恢復,提高你的循環邏輯:與樣本輸出

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

void dataentry(void); 

int count = 0; 
float max, min, mean, old, new; 
float data; 
char Old[10], Data[10], choice[25]; 

int main(void) 
{ 
    dataentry(); 
} 

void dataentry(void) 
{ 
    printf(" |Enter Wind Speed Value:\n"); 
    printf("**|Enter -1 to exit data entry mode|**\n"); 

    if (!fgets(Old, sizeof(Old), stdin)) { 
     fprintf(stderr, "No input.\n"); 
     exit(EXIT_FAILURE); 
    } 

    if (sscanf(Old, "%f", &old) != 1) { 
     fprintf(stderr, "Badly formed input, enter a float next time.\n"); 
     exit(EXIT_FAILURE); 
    } 

    max = old; 
    min = old; 
    data = 1; 
    count = 1; 

    printf("max=%f, min=%f, data=%f, count=%d.\n", max, min, data, count); 

    while (1) { 
     printf("Enter data value: "); 
     fflush(stdout); 

     if (!fgets(Data, sizeof(Data), stdin)) { 
      break; 
     } 

     if (sscanf(Data, "%f", &data) != 1) { 
      fprintf(stderr, "Badly formed input, enter a float next time.\n"); 
      exit(EXIT_FAILURE); 
     } 

     if (data < 0) { 
      break; 
     } 
     else { 
      ++count; 
     } 

     if (data >= max) { 
      max = data; 
     } else if (data <= min) { 
      min = data; 
     } 
    } 

    printf("max=%f, min=%f, data=%f, count=%d.\n", max, min, data, count); 
} 

[email protected]:~/src/sandbox$ ./ssf 
    |Enter Wind Speed Value: 
**|Enter -1 to exit data entry mode|** 
10 
max=10.000000, min=10.000000, data=1.000000, count=1. 
Enter data value: 11 
Enter data value: 12 
Enter data value: 9 
Enter data value: 8 
Enter data value: -1 
max=12.000000, min=8.000000, data=-1.000000, count=5. 
[email protected]:~/src/sandbox$ 

使用所有這些全局變量也是非常糟糕的形式。至少用你目前的程序,你可以在dataentry()之內定義它們中的每一個。