2011-01-06 89 views
0

我們如何通過ac代碼檢查用戶i/p是否正確.. 因爲我們要求用戶i/p的姓名和年齡,那麼檢查的語法應該是輸入的數據是否正確? 代碼應該在C檢查是否有正確的用戶輸入

+0

這是錯誤信息,但我們將如何檢查I/P數據是否正確或不正確..這將是什麼語法.. – kamakshi 2011-01-06 10:51:41

+1

我的內置驗證告訴我你上面的輸入是絕對不正確的字母,缺少標點符號)。如果你不喜歡用適當的語言來寫這個問題,你如何期待任何人關心寫一個答案? – Suma 2011-01-06 12:14:57

回答

1

對於名稱,將用戶輸入存儲在字符串中。如果數組元素不是'a'到'z'或'A'到'Z',則遍歷字符串並說錯誤。至於年齡考慮,你可以使用char數組或整數。如果用戶輸入「a」,則使用整數,將採用ascii值。但是,如果你使用char數組,你只能看到數字和限制。

INT主要()

{

char name[10],age[2]; 
int i; 
printf("Enter name and age \n"); 
scanf("%s %s",name,age); 
for(i=0; name[i]!=NULL; i++) 
    if(isdigit(name[i])) 
     printf("Error, name in aplahbets\n"); 
for(i=0; age[i]!=NULL; i++) 
    if(isalpha(age[i])) 
     printf("Error, age in numbers\n"); 

// Rest of your code Your code 
return 0; 

}

+0

可以ü請通過語法解釋.. – kamakshi 2011-01-06 10:52:31

+0

thanx的支持... – kamakshi 2011-01-07 05:18:03

+0

您的解決方案的崩潰名稱超過900個字符,!= NULL也瀰漫。 – user411313 2012-05-19 17:37:21

1

年齡通常是自然數,範圍從0到130根據您的應用程序,一個更現實的範圍可能是15到65.看看你的要求。

int IsNaturalNumber(const char* number) 
{ 
    while(*number) { 
     if(!isdigit(*number)) 
      return 0; 
     ++number; 
    } 

    return 1; 
} 

char age[20+1] = { 0 }; 
if(!fgets(age, 20, stdin)) error("EOF reached!"); 
if(!IsNaturalNumber(age)) error("Please enter a natural number!"); 
int age_as_int = atoi(age); 
if(age_as_int < LOWER_AGE_BOUND || age_as_int > UPPER_AGE_BOUND) 
    error("Age must be between %d and %d.", LOWER_AGE_BOUND, UPPER_AGE_BOUND); 

名字很棘手。什麼是專名?常用的形式是稱呼(先生/先生/小姐),名字和姓氏/姓氏。這涵蓋了很多文化。不要忘記考慮語言。例如,先生=先生,夫人=弗勞,小姐=Fräulein德國人。另外,有些文化比較喜歡用名字表達姓名(例如日本)。你有什麼要求?你需要考慮所有的文化,還是隻有少數?

+0

我會考慮只是一個簡單的名字(姓和名),現在我不包括稱呼.. – kamakshi 2011-01-06 10:55:35

+0

什麼是「ISDIGIT」在這裏? – kamakshi 2011-01-06 10:59:00

+0

@kamakshi:isdigit是C標準庫中的一個函數,用於檢查給定字符是否代表數字,即字符的範圍爲'0'...'9' – datenwolf 2011-01-06 11:29:45

0

執行輸入驗證的常用方法是將輸入作爲字符串讀入程序,然後驗證它並轉換爲預期類型。

對於名稱,沒有太多有用的驗證可以做。你可以(也應該)檢查輸入是否超出你的預期,但是否則大多數輸入應該被視爲有效的名字。

對於年齡,你可以做更多的驗證。首先,輸入必須是有效整數,其次必須在一定範圍內。

您可以使用以下功能:

char* readString(char* buffer, size_t buflen) 
{ 
    char* result; 
    result = fgets(buffer, buflen, stdin); 

    if ((result != NULL) && 
     (strlen(result) == buflen-1) && 
     (result[buflen-2] != '\n')) 
    { 
    /* too long a line */ 

    /* read the remainder of the line, to clear the input buffers */ 
    while ((result != NULL) && (result[strlen(result)-1] != '\n')) 
    { 
     result = fgets(buffer, buflen, stdin); 
    } 

    /* set result to NULL to indicate an error */ 
    result = NULL; 
    } 

    if (result != NULL) 
    { 
    /* strip the newline */ 
    result[strlen(result)-1] = '\0'; 
    } 
} 

bool readInt(int low, int high, int* value) 
{ 
    char temp[80]; 

    if (readString(temp, 80)) 
    { 
    char* endp; 
    long result = strtol(temp, &endp, 10); 
    if ((*endp == '\0') && (result >= low) && (result <= high)) 
    { 
     *value = result; 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
    } 
    else 
    { 
    return false; 
    } 
} 
0

沒有任何年齡溢/下溢檢查簡短的解決方案可能是:

char name[40]; 
unsigned age; 

if(scanf("%39s%u",name,&age)==2) 
    printf("name=%s age=%u",name,age); 
else 
    puts("input invalid"); 

你應該不斷檢查任何用戶的回報-inputs。