C-!isalpha将unsignedchar类型的字符视为非字母
该函数从用户读取两个输入,两个输入都是字符串,但一个应该只包含数字,另一个应该只包含字符。我有一个验证函数来检查字符串是否不包含字母字符。
bool checkString( const char inputString[] ){
unsigned char inputChar;
bool errorFree = true;
while ( ( inputChar = *inputString ) ){
if(!isalpha(inputChar)){
errorFree = false;
}
++inputString;
}
return errorFree;
}
在!isalpha(inputChar)保持正常处理字符作为不是字母,并运行设置errorFree为false。在调用此函数之前,已获取另一个字符串输入。全功能:
void createNewEmployee(char* header, char* records, long size ){
char newID[MAX];
int numberOfRecords = getNumberOfRecords(records);
//printf("num of records: %d",numberOfRecords);
createID(numberOfRecords, (char *) newID );
//printf("%s",newID);
char telNum[15];
char name[40];
bool telValidated = false;
bool nameValidated = false;
while(!telValidated){
fputs("enter some number: ", stdout);
fflush(stdout);
if ( fgets(telNum, sizeof(telNum), stdin) ) {
int number;
if ( sscanf(telNum, "%d", &number) == 1 ) {
// printf("is all number = %dn", number);
telValidated = true;
}
else{
printf("enter numbers onlyn");
}
}
}
while(!nameValidated){
fputs("enter name: ", stdout);
fflush(stdout);
if ( fgets(name, sizeof(name), stdin) ) {
if(checkString(name)){
printf("error Free");
nameValidated = true;
}
else{
printf("enter characters only!n");
}
}
}
addNewRecord(newID,"anotherNew,01293073232,newDepartmentn",header, records, size);
}
我想这可能是因为最后一个 fgets 中的输入仍然存在于当前 fgets 中?
回答
这就是为什么将您的主程序也发布到您测试它的地方总是有帮助的原因。我的猜测是,根据您获取输入的方式,也许您在字符串的末尾存储了一个换行符,该换行符不是字母字符。
此外,您的函数有一个更优雅的解决方案。一旦发现错误,就无需继续查看字符串。所以,只要发生这种情况就返回 false。从技术上讲,这并不重要,因为您的函数和我的函数都是 O(N) 运行时。不过,这样想还是不错的。如果您有一个 1000 个字符的字符串,并且第 3 个字符不是字母怎么办。为什么还要继续检查所有 997 个其他字符?
bool checkString(const char inputString[]) {
while (*inputString) {
if (!isalpha(*inputString))
return false;
++inputString;
}
return true;
}
回答
当fgets读取一行时,它'n'在缓冲区中包含换行符 , 。换行符不是字母,因此isalpha返回 false。
修复您的代码以删除或忽略缓冲区中的换行符。