c编程中的输入验证

时间:2015-12-04 06:25:31

标签: c

我的学院有一个关于电话簿的小项目。我有一个问题来验证名称的第一个字符,我使用ascii来验证名称的第一个字符。名字的第一个字符应该是(A-Z)或(a-z),有人可以帮我解决我的问题吗?谢谢!

#pragma warning (disable:4996)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(){
   char name[30];
   int flag;
   int i;

   printf("Add New Contact\n");

   start:
   do {
      printf("input name[1..30 chars]: ");
      scanf("%s", name); fflush(stdin);

      for (i = 0; i < strlen(name); i++) {
         if (name[1] >= 65 && name[1] <= 90 || name[1] >= 97 && name[1] <= 122) {
            flag = 1;
         }
         else {
            printf("First letter of name should be an alphabet (A-Z or a-z)\n");
            getchar();
            goto start;
         }
      }
   } while (flag == 0);

   getchar();
   return 0;
}

3 个答案:

答案 0 :(得分:2)

数组的第一个元素具有索引0.更改为:

(name[0] >= 65 && name[0] <= 90 || name[0] >= 97 && name[0] <= 122)

如果你使用了char litterals,它会更具可读性,改为:

(name[0] >= 'A' && name[0] <= 'Z' || name[0] >= 'a' && name[0] <= 'z')

还有isalpha函数可以为您进行测试...

也不要把你的测试放在for循环中,你说你只想测试第一个字母,为什么要循环呢?这应该是这样的(同时删除gotofflush,不必要的getchar,并添加括号以帮助阅读条件):

do {
  printf("input name[1..30 chars]: ");
  scanf("%s", name);
  if ( (name[0] >= 'A' && name[0] <= 'Z') || (name[0] >= 'a' && name[0] <= 'z') ) {
      flag = 1;
  }
  else {
      printf("First letter of name should be an alphabet (A-Z or a-z)\n");
  }
} while (flag == 0);

答案 1 :(得分:1)

数组的第一个char从索引0开始,而不是1。因此,您需要将其更改为:

  if (name[0] >= 65 && name[0] <= 90 || name[0] >= 97 && name[0] <= 122) {

   }

您可以使用isalpha(),它甚至简单易用。

请注意,{C}中的fflush(stdin);未定义的行为

答案 2 :(得分:1)

 if (name[1] >= 65 && name[1] <= 90 || name[1] >= 97 && name[1] <= 122) {
        flag = 1;
    }

name[1]将首先检查第二个字符。数组索引以0029 开头)开头,因此第一个字符为name[0]

一个点 - 而不是计算循环内的字符串长度,先计算它,存储到变量中,然后在条件下使用它。

注意 - 当您使用do-while循环时,为什么甚至使用goto。循环将以任何方式迭代( ofcourse,直到 flag不是1)。没有必要。