c - 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?
解决方案
这就是为什么在您测试它的地方发布您的主程序总是有帮助的。我的猜测是,根据您获取输入的方式,您可能在字符串末尾存储了一个不是字母字符的换行符。
此外,您的函数有一个更优雅的解决方案。一旦发现错误,就无需继续查看字符串。所以,只要发生这种情况就返回 false 。从技术上讲,这并不重要,因为您的函数和我的函数都是 O(N) 运行时。不过,这样想还是不错的。如果你有一个 1000 个字符的字符串,而第三个字符不是按字母顺序排列的。为什么还要继续检查所有其他 997 个字符?
bool checkString(const char inputString[]) {
while (*inputString) {
if (!isalpha(*inputString))
return false;
++inputString;
}
return true;
}
推荐阅读
- c# - 在设置 DataContext 之前过早调用 WPF OnCreateAutomationPeer
- azure-devops - 无法删除 TF 工作区
- python - 使用远程SSH扩展时的python全局模块安装
- javascript - 如何使用 ng-material-treetable 更改列宽?
- aws-application-load-balancer - 为什么无法在没有自定义域(及其 TLS 证书)的情况下使用 HTTPS 侦听器创建 ALB?
- azure - 使用授权代码流在@azure/msal-node 中未返回刷新令牌?
- macos - 为 2012 年中的 MacBook Air 制作 Windows10 可启动媒体
- python - page_source 打印上一个登录页面 html,尽管浏览器显示使用 Selenium 和 Python 成功登录
- javascript - 反应一个状态数据自动变化
- javascript - Javascript 将数据表导出到 csv 但想要包含表头并排除三列