我的学院有一个关于电话簿的小项目。我有一个问题来验证名称的第一个字符,我使用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;
}
答案 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循环中,你说你只想测试第一个字母,为什么要循环呢?这应该是这样的(同时删除goto
和fflush
,不必要的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]
将首先检查第二个字符。数组索引以0
(0
到29
开头)开头,因此第一个字符为name[0]
。
一个点 - 而不是计算循环内的字符串长度,先计算它,存储到变量中,然后在条件下使用它。
注意 - 当您使用do-while
循环时,为什么甚至使用goto
。循环将以任何方式迭代( ofcourse,直到 flag
不是1
)。没有必要。