2012-05-21 138 views
1

這裏是我的一點ç片斷生成段故障:Ç - 分段故障

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

int checkTiime(char time[]); 

int main(int argc, char** argv) { 

    char time1[6]; 
    char time2[6]; 

    printf("Tempo 1 [hh:mm]: "); 
    fgets(time1, sizeof time1, stdin); 
    printf("Tempo 2 [hh:mm]: "); 
    fgets(time2, sizeof time2, stdin); 

    printf("Checktime: %d", checkTime(time1)); 

    return (EXIT_SUCCESS); 
} 

int checkTime(char time[]){ 

    long hours = 0; 
    long minutes = 0; 

    if(time[2] == ':') { 

     if(isdigit(time[3]) && isdigit(time[4]) && isdigit(time[0]) && isdigit(time[1])) { 
      hours = strtol(time[0], NULL, 10) + strtol(time[1], NULL, 10); 
      minutes = strtol(time[3], NULL, 10) + strtol(time[4], NULL, 10); 

      if((hours >= 0 && hours <= 23) && (minutes >= 0 && minutes <= 59)){ 

       return 0; 

      } else { 

       return 1; 

      } 

     } else { 

      return 1; 

     } 

    } else { 

     return 1; 

    } 

} 

有人可以幫助我。我真的不知道爲什麼給我的問題。我也注意到,當我輸入時,例如,「12:34」它要求我輸入第二個輸入,但是當我編寫「12:34」時,然後使用退格刪除「34」並輸入「34 「它再次寫入第二個printf,但不允許我輸入第二個輸入並退出程序。

個人點評:

我注意到,這是更好地使用gets()功能,輸入字符串東陽它不計算\n字符。

回答

3

使用fgets時要小心。您的來電要求它在輸入換行符或EOF前最多讀入6個字符。 fgets認爲換行符是一個有效的字符並存儲它,如果遇到這種情況。現在,在你的情況下,最後一個字符不是NULL,因爲它應該是C風格的字符串,但是是\n。您需要將其替換爲NULL,然後才能將其傳遞到strtol,該文件需要C樣式NULL終止的字符串。所以:

if (fgets(time1, sizeof time1, stdin) != NULL) { 
    time1[ sizeof time1 - 1 ] = NULL; 
} 

,或者甚至更好:

if (fgets(time1, sizeof time1 - 1, stdin) != NULL) { 
    // hurray we have the time! 
} 

或者,你可以有自己的換行符安全fgets包裝:

char *chomp(char *buf, size_t sz, FILE *fp, size_t *outsz) { 
    char *p = fgets(buf, sz - 1, fp) ; /* make sure there is room for terminating NULL */ 
    if (p != NULL) { 
     char *nl = strchr(buf, '\n'); 
     if (nl) *nl = NULL; /* replace trailing newline */ 
     *outsz = strlen(buf); /* recompute */ 
    } 
    return p; 
} 
+0

感謝您的幫助。無論如何,我剛剛使用'gets()'函數解決了我的問題,並將分解時間分解爲包含小時和分鐘的2個字符串。 – siannone

+0

'gets'是危險的。不要使用它。學習如何使用'fgets'或'scanf'。 – dirkgently