2010-11-13 94 views
1

我正在使用這段代碼來讀取用戶輸入並檢查它是否是數字,但是它真的只適用於數字和字母。我希望它能與每個字符一起工作。例如 」!?%」。我已經試圖通過「isascii」來改變「isalnum」,但這不起作用。用於檢查用戶輸入的do-while循環使用c

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

int main() 
    { 

    int a; 
    int b = 1; 
    char c ; 

    do 
    { 
     printf("Please type in a number: "); 

     if (scanf("%d", &a) == 0) 
     { 
     printf("Your input is not correct\n"); 
     do 
     { 
      c = getchar(); 
     } 
     while (isalnum(c)); 
     ungetc(c, stdin);  
     } 
     else 
     { 
     printf("Thank you! "); 
     b--; 
     } 

    } 
    while(b != 0); 

    getchar(); 
    getchar(); 

    return 0; 
    } 
+2

莫非你請修理你的縮進? – 2010-11-13 11:59:08

+0

我不明白你的問題。你想測試什麼字符*拒絕*? – 2010-11-13 12:00:54

+0

我想拒絕除數字以外的所有字符。 – Ordo 2010-11-13 12:06:41

回答

2

除非你有特殊要求,應在嚴格C89使用fgetssscanf

while (1) { 
    char buf[1000]; 
    printf("Please input a number: "); 
    fflush(stdout); 
    if (!fgets(buf, sizeof buf, stdin)) assert(0 && "error in fgets. shouldn't have hapenned ..."): 
    /* if enter pending, remove all pending input characters */ 
    if (buf[strlen(buf) - 1] != '\n') { 
     char tmpbuf[1000]; 
     do { 
      if (!fgets(tmpbuf, sizeof tmpbuf, stdin)) assert(0 && "error in fgets. shouldn't have hapenned ..."); 
     } while (buf[strlen(tmpbuf) - 1] != '\n'); 
    } 
    if (sscanf(buf, "%d", &a) == 1) break; /* for sufficiently limited definition of "numbers" */ 
    printf("That was not a number. Try again\n"); 
} 
2

以正確的方式與清除輸入緩衝區,檢查溢出的樣子:

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

int readLong(long *l) 
{ 
    char *e,in[20]; 
    fgets(in,20,stdin); 
    if(!strchr(in,'\n')) while(getchar()!='\n'); 
    else *strchr(in,'\n')=0; 
    errno=0; 
    *l=strtol(in,&e,10); 
    return *in&&!*e&&!errno; 
} 

int main() 
{ 
    long l; 
    if(readLong(&l)) 
    printf("long-input was OK, long = %ld",l); 
    else 
    puts("error on long-input"); 
    return 0; 
} 
+0

+1,但你應該增加'in'的大小。 「long」可能是64位,-9223372036854775808(包括' - '的20個字符)是有效的,但不能被您的函數接受。 – pmg 2010-11-13 13:49:28

+0

對不起,但我太複雜了。我只想要一個簡單的解決方案。有什麼我可以使用,而不是isalnum(),我試過isascii(),但這不適合我。 – Ordo 2010-11-14 20:24:26

+0

它太難以調用函數了嗎?每次你自己處理inputbuffer都不難? – user411313 2010-11-14 21:17:24