2012-11-28 7 views
0

我寫取號,並顯示該號碼,計算器會顯示出來(見下圖),沒有問題的編譯程序後掛起,但是當我嘗試運行它,我可以輸入我的號碼,但沒有任何反應。它似乎是「掛起來」,因爲沒有進一步的輸出結果如我所預期的那樣顯示出來。可能有人知道問題是什麼?C程序不按預期投放,輸入

#include <stdio.h> 
#define MAX_DIGITS 20 

char segments[10][7] =    /* seven segment array */ 
    {{'1','1','1','1','1','1','0'}, /* zero */ 
    {'0','1','1','0','0','0','0'}, /* one */ 
    {'1','1','0','1','1','0','1'}, /* two */ 
    {'1','1','1','1','0','0','1'}, /* three */ 
    {'0','1','1','0','0','1','1'}, /* four */ 
    {'1','0','1','1','0','1','1'}, /* five */ 
    {'1','0','1','1','1','1','1'}, /* six */ 
    {'1','1','1','0','0','0','0'}, /* seven */ 
    {'1','1','1','1','1','1','1'}, /* eight */ 
    {'1','1','1','0','0','1','1'}};/* nine */ 
char digits[3][MAX_DIGITS * 4];  /* digits array */ 
int i, j;       /* count variables */ 
int adjust;       /* output formatting */ 

int main(void) { 
    clear_digits_array(); 

    int digit[20]; 
    for (i = 0; i < 20; i++) { 
     digit[i] = 0; 
    } 

    int count = 20; 
    int position = 0; 

    printf("Enter a number: "); 

    int number = scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", 
      &digit[0], 
      &digit[1], 
      &digit[2], 
      &digit[3], 
      &digit[4], 
      &digit[5], 
      &digit[6], 
      &digit[7], 
      &digit[8], 
      &digit[9], 
      &digit[10], 
      &digit[11], 
      &digit[12], 
      &digit[13], 
      &digit[14], 
      &digit[15], 
      &digit[16], 
      &digit[17], 
      &digit[18], 
      &digit[19]);      //NOTHING HAPPENS AFTER HERE 

    printf("Got input, number is %d", number); 

    while (count > 0) { 
     printf("Reading digits, count is %d", count); 
     process_digit(digit[20 - count], position); 
     position++; 
     count--; 
    } 

    print_digits_array(); 
    printf("\n"); 
    return 0; 
} 

void clear_digits_array(void) { 
    /* fill all positions in digits array with blank spaces */ 
    for (i = 0; i < 3; i++) { 
     for (j = 0; j < (MAX_DIGITS * 4); j++) { 
      digits[i][j] = ' '; 
     } 
    } 
} 

void process_digit(int digit, int position) { 
    /* check each segment to see if segment should be filled in for given digit */ 
    for (i = 0; i < 7; i++) { 
     printf("Processing digit %d at position %d, i is %d", digit, position, i); 
     if (segments[digit][i] == 1) { 
      switch (i) { 
       case 0: digits[0][(position * 4) + 1] = '_'; 
         break; 
       case 1: digits[1][(position * 4) + 2] = '|'; 
         break; 
       case 2: digits[2][(position * 4) + 2] = '|'; 
         break; 
       case 3: digits[2][(position * 4) + 1] = '_'; 
         break; 
       case 4: digits[2][(position * 4) + 0] = '|'; 
         break; 
       case 5: digits[1][(position * 4) + 0] = '|'; 
         break; 
       case 6: digits[1][(position * 4) + 1] = '_'; 
         break; 
      } 
     } 
    } 
} 

void print_digits_array(void) { 
    /* print each character in digits array */ 
    for (i = 0; i < 3; i++) { 
     for (j = 0; j < (MAX_DIGITS * 4); j++) { 
      printf("%c", digits[i][j]); 
     } 
     printf("/n"); 
    } 
} 
+0

它的工作像它應該,可能是你錯過輸入數字時有些事。 –

+0

我向你保證,它不會像它應該那樣工作... – user41419

回答

3

代碼包括:

printf("Enter a number: "); 

int number = scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", 
     &digit[0], 
     &digit[1], 
     &digit[2], 
     &digit[3], 
     &digit[4], 
     &digit[5], 
     &digit[6], 
     &digit[7], 
     &digit[8], 
     &digit[9], 
     &digit[10], 
     &digit[11], 
     &digit[12], 
     &digit[13], 
     &digit[14], 
     &digit[15], 
     &digit[16], 
     &digit[17], 
     &digit[18], 
     &digit[19]);      //NOTHING HAPPENS AFTER HERE 

您輸入了20級多項獨立的數字?如果不是,scanf()正在等待你輸入更多的號碼。

注意,從scanf()返回值是成功數轉換號碼(0..20中的例子),而不是價值您輸入。


是這個問題?我試圖讓用戶可以輸入的最大數量爲20,如果輸入了更多數字,他們將被忽略,或者如果輸入的數字較少,它只會考慮這些數字(比如說5個輸入,然後只輸入5將被使用)。那麼有沒有更簡單的方法來做這種事情?

是的,我認爲這是個問題。

可能有幾種更簡單的方法來做到這一點。我會嘗試使用:

char buffer[22]; // 20 digits, newline, null 
if (fgets(buffer, sizeof(buffer), stdin) != EOF) 
{ 
    size_t len = strlen(buffer); 
    if (len >= sizeof(buffer) - 1) 
    { 
     fprintf(stderr, "You entered too long a string (maximum 20 digits)\n"); 
     exit(EXIT_FAILURE); 
    } 
    if (len > 0) 
     buffer[--len] = '\0'; // Zap newline — carefully 
    for (int i = 0; i < len; i++) 
    { 
     if (!isdigit(buffer[i])) 
     { 
      fprintf(stderr, "Non-digit %c found\n", buffer[i]); 
      exit(EXIT_FAILURE); 
     } 
    } 
    ...and from here, process the digits in buffer, one at a time... 
    ...Use buffer[i] - '0' to get a number 0..9 from the character in buffer... 
} 

另一種選擇是使用long long數,但只給你最多18位(簽字)或19位(無符號),用19或20的某些值也在範圍之內。然後,您會使用分割和模數運算將數字從數字中除去。

long long value; 
if (scanf("%lld", &value) == 1) 
{ 
    if (value < 0) 
     ...error processing... 
    do 
    { 
     int digit = value % 10; 
     value /= 10; 
     ...process digit... 
    } while (value > 0); 
} 

這有一些優點,但在實踐中,我會嘗試使用fgets()讀取一行輸入,並且或者sscanf()strtoll()轉換和驗證的數量。這並不像看起來那麼簡單;特別是從strtoll()返回的錯誤是很多且微妙的,並且scanf()家族都沒有優雅地處理溢出的數字。你可以約束scanf()雖與%18lld使不超過18位被讀取,但是這意味着,如果用戶輸入19個或多個數字,你會得到下一次嘗試與scanf()閱讀剩菜。所以,處理scanf()也不是那麼簡單,特別是如果您需要在程序的單次運行中轉換多個數字。

有了這些警告的出路,你通常可以做一個「足夠好」的工作與提供輸入一個理智的人。這是一個程序防爆的過程(很簡單 - 就像在證明傻瓜一樣),這很難。當我可以報告讀入的整個字符串時(如fgets()),我發現有意義的錯誤報告更容易;與scanf(),您看不到出現錯誤之前輸入和使用的字符。

+0

這是問題嗎?我試圖讓用戶可以輸入的最大數量爲20,如果輸入了更多數字,他們將被忽略,或者如果輸入的數字較少,它只會考慮這些數字(比如說5個輸入,然後只輸入5將被使用)。那麼有沒有更簡單的方法來做這種事情? – user41419

+0

非常感謝您的詳細幫助和解答!我很感激。但是,還有一個問題。現在,一切運行良好,但最後的輸出(段顯示)根本不顯示。只有空白。爲什麼會這樣呢? – user41419

+0

我沒有看過那個代碼,但我不得不猜測你沒有處理用戶輸入的數字轉換爲正確打印的字符串。這一部分是爲了您在這一點上進行調試。也許你應該考慮使用要打印的字符('|','_'或''(空白))編碼'segments'數組,以便不需要開關映射字符。 –

0
int number = scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", 
      &digit[0], 
      &digit[1], 
      &digit[2], 
      &digit[3], 
      &digit[4], 
      &digit[5], 
      &digit[6], 
      &digit[7], 
      &digit[8], 
      &digit[9], 
      &digit[10], 
      &digit[11], 
      &digit[12], 
      &digit[13], 
      &digit[14], 
      &digit[15], 
      &digit[16], 
      &digit[17], 
      &digit[18], 
      &digit[19]);   

我不認爲這是一個好主意,用loop這裏

for (i = 0; i < 20; i++) 
     scanf("%d",&digit[i]); 

如果你需要的number 然後做這樣的

int number = i;當循環結束。

你也可以試試這個

char buf[12]; 
while((c=getchar())!=EOF && i < 20) 
{ 
buf[j++] =c; 
if((c == '\n' || c == ' ' || c == '\t') && (sscanf(buf,"%d",&digit[i])) == 1) 
    { 
    i++; 
    j = 0; 
    } 
} 

對於EOF你必須按CTRL+D 這樣你可以把20點或更少的整數