1.hexify.c 的代码展示
2.举例及解释
3.知识归纳
1.hexify.c代码如下
/* Convert sequence of hex digits on command line into a string, terminated by \n */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int i;
for (i = 1; i < argc; i++) {
unsigned long dig = strtoul(argv[i], NULL, 16);//将argv[i]转化为十六进制数
putchar((char) dig);
}
putchar('\n');
return 0;
}
2.实例如下
输入参数:30 31 32 33 34 35 36 37 38 39
zoe@zoe-virtual-machine:/mnt/hgfs/Notepad++$ gcc hexify.c
zoe@zoe-virtual-machine:/mnt/hgfs/Notepad++$ ./a.out 30 31 32 33 34 35 36 37 38 39
0123456789
输出为:0123456789
程序将输入的十六进制数转化为无符号长整型,最后又强制转化为字符逐个输出,如30H为48,ASCII码为48所对应的字符是0。
3.知识点
函数unsigned long strtoul(const char *nptr,char **endptr,int base)
strtoul()会将参数nptr字符串根据参数base来转换成无符号的长整型数。参数base范围从2至36,或0。参数base代表采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制数等。当base值为0时会根据情况选择用哪种进制:如果第一个字符是’0’,就判断第二字符如果是‘x’则用16进制,否则用8进制;第一个字符不是‘0’,则用10进制。一开始strtoul()会扫描参数nptr字符串,跳过前面的空格字符串,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回。
强制类型转换
例如要求整型变量m除以2得到的浮点数,我们使用m/2.0.或者使用(float)m/2对m进行强制类型转换,来确保除法运算结果的小数部分不会被截断。注意,不能将表达式(foat)m/2写成float(m)/2 或float(m/2)。写成(float)(m/2)虽然是合法的,但(float(m/2)是将 m/2整除的结果(已经舍去了小数位)强制转换为浮点数(相当于在其小数位添加了0),因此并不能真正得到m与2相除的小数部分。此外,强制类型转换运算(float)m只是一个含有强制转换运算符的表达式,表达式的结果是将m转换为浮点数后的结果,它并不能改变变量m的类型和数值。