2011-01-06 93 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。