char和int是否可以在C中用于函数参数?

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]指向相同的位置.

  • 请注意有符号和无符号值.如果您只使用0-127范围内的字符,那么没有问题. (3认同)
  • @ user1527227不,编程习惯也不错.糟糕的编程习惯是将`int`传递给一个函数,该函数需要`char`而不采取预防措施来确保该值不被截断. (2认同)