首页 > 解决方案 > C - !isalpha 将 unsigned char 类型的字符视为非字母字符

问题描述

该函数从用户读取两个输入,两个输入都是字符串,但一个应该只包含数字,另一个应该只包含字符。我有一个验证函数来检查字符串是否不包含字母字符。

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 = %d\n", number);

                telValidated = true;
            }

            else{
                printf("enter numbers only\n");
            }
        }
 }

  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,newDepartment\n",header, records, size);

}

我认为这可能是因为最后一个 fgets 中的输入仍然被带入了当前 fgets?

在此处输入图像描述

标签: c

解决方案


这就是为什么在您测试它的地方发布您的主程序总是有帮助的。我的猜测是,根据您获取输入的方式,您可能在字符串末尾存储了一个不是字母字符的换行符。

此外,您的函数有一个更优雅的解决方案。一旦发现错误,就无需继续查看字符串。所以,只要发生这种情况就返回 false 。从技术上讲,这并不重要,因为您的函数和我的函数都是 O(N) 运行时。不过,这样想还是不错的。如果你有一个 1000 个字符的字符串,而第三个字符不是按字母顺序排列的。为什么还要继续检查所有其他 997 个字符?

bool checkString(const char inputString[]) {
    while (*inputString) {
        if (!isalpha(*inputString))
            return false;
        ++inputString;
    }
    return true;
}

推荐阅读