检查用户输入是否正确

时间:2011-01-06 10:38:32

标签: c

如何通过c代码检查用户i / p是否正确.. 因为我们从用户i / p询问姓名和年龄,那么检查输入数据是否正确的语法应该是什么? 代码应该在C

4 个答案:

答案 0 :(得分:1)

对于名称,将用户输入存储在字符串中。如果数组元素不是'a'到'z'或'A'到'Z',则遍历字符串并说出错误。至于考虑年龄,可以使用char数组或整数。当用户输入'a'时使用整数,将采用ascii值。但是如果你使用char数组,你只能看到数字和限制。

int main()

{

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;

}

答案 1 :(得分: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);

名字很棘手。什么是正确的名字?一种常用的形式是Salutation(Mr./Mrs./Miss),名字和姓氏/姓氏。这涵盖了很多文化。不要忘记考虑语言。 Mr. = Herr,Mrs。= Frau,Miss =Fräulein,例如德语。此外,一些文化在表格中的名字之前更喜欢姓氏(例如日本)。你有什么要求?你需要考虑所有文化,还是仅仅考虑一些文化?

答案 2 :(得分: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;
  }  
}

答案 3 :(得分:0)

没有任何年龄溢出/下溢检查,可以采用以下简短解决方案:

char name[40];
unsigned age;

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

你应永远检查任何用户输入的回报。