use*_*227 1 c c++ int alphanumeric char
我写了一些代码来验证C中的序列号是字母数字使用isalnum.假设isalnum输入是我写的代码char.一切正常.但是,在查看isalnum后面的内容后,我发现它需要输入为int.我的代码是否可以改变它的方式?
如果我确实需要改变,那么正确的方法是什么?我应该只声明一个int并将其设置为char并将其传递给isalnum?这被认为是糟糕的编程习惯吗?
提前致谢.
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
bool VerifySerialNumber( char *serialNumber ) {
int num;
char* charPtr = serialNumber;
if( strlen( serialNumber ) < 10 ) {
printf("The entered serial number seems incorrect.");
printf("It's less than 10 characters.\n");
return false;
}
while( *charPtr != '\0' ) {
if( !isalnum(*charPtr) ) {
return false;
}
*charPtr++;
}
return true;
}
int main() {
char* str1 = "abcdABCD1234";
char* str2 = "abcdef##";
char* str3 = "abcdABCD1234$#";
bool result;
result = VerifySerialNumber( str1 );
printf("str= %s, result=%d\n\n", str1, result);
result = VerifySerialNumber( str2 );
printf("str= %s, result=%d\n\n", str2, result);
result = VerifySerialNumber( str3 );
printf("str= %s, result=%d\n\n", str3, result);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
str= abcdABCD1234, result=1
The entered serial number seems incorrect.It's less than 10 characters.
str= abcdef##, result=0
str= abcdABCD1234$#, result=0
Run Code Online (Sandbox Code Playgroud)
Mik*_*olt 10
您无需更改它.编译器会在传递给你之前隐式转换char为a .像take 参数这样的函数,因为函数像返回值,它允许存在特殊值.intisalnumisalnumintfgetcintEOF
更新:正如其他人所提到的,要小心你的负值char.您的C库版本可能会小心实施,以便处理负值而不会导致任何运行时错误.例如,glibc(标准C库的GNU实现)似乎通过向int参数添加128来处理负数.*但是,您并不总是能够依靠isalnum(或任何其他<ctype.h>功能)悄悄地处理负数,因此养成不检查的习惯将是一个非常糟糕的主意.
*从技术上讲,它不是向参数本身添加128,而是它似乎是使用参数作为数组的索引,从索引128开始,这样传入,比方说,-57将导致访问71数组的索引.但结果是相同的,因为array[-57+128]并(array+128)[-57]指向相同的位置.
| 归档时间: |
|
| 查看次数: |
3228 次 |
| 最近记录: |