hexify(将命令行上的十六进制数字序列转换为字符串)代码内容:
/* 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);
putchar((char) dig);
}
putchar('\n');
return 0;
}
下面我将分别解释:
/* Convert sequence of hex digits on command line into a string, terminated by \n */
/ * 符号和 * / 符号:里面内容为C语言的注释,不会被运行,英文意思为将命令行上的十六进制数字序列转换为字符串,以\n结束。
#include <stdio.h>
#include <stdlib.h>
#include<stdio.h>是编译预处理命令,即在程序编译之前要处理的内容,<>中以以“.h ”作为结尾的文件称为头文件,如stdio.h,stdlib.h,string.h均为头文件。
stdio 即 “standard input & output"(标准输入输出)在开头加上#include <stdio.h>即可实现c语言中的 输入函数printf、输出函数scanf等函数。
同样,在开头加上#include <stdlib.h>即可实现c语言中的exit、malloc、free等函数。在此程序中用到了它的strtoul函数。
类似的,在开头加上#include <string.h>即可实现关于字符数组的函数,例如连接字符串函数strcat,复制字符串函数strcpy,比较字符串(区分大小写)函数strcmp等。
int main(int argc, char *argv[]) {
程序的主函数,有main()函数的程序才能运行,即函数必须被main()直接或间接调用才能发挥作用,主函数的返回值类型为int(整型)。其中,main函数可以带参数,这个参数可以认为是main函数的形式参数。C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。可参考关于main函数参数和int main(int argc,char* argv[])详解
C语言还规定argc(第一个形参)必须是整型变量,argv(第二个形参)必须是指向字符串的指针数组。
argc是命令行总的参数个数,argv[]是argc个参数,其中第0个参数argv[0]指向程序运行的全路径名,以后的参数为命令行后面跟的用户输入的参数。
通过阅读后续代码,可以发现它利用了这些参数间关系。
int i;
定义一个整型变量(int),整型变量,在内存中占4个字节,最长能到32位二进制位,其取值为基本整常数,在该定义中,变量名为i。
补充:关于c语言基本数据类型,除了int,还有float,double,char,short,long,可参考c语言基本数据类型short、int、long、char、float、double
for (i = 1; i < argc; i++) {
for循环语句用来实现当型循环,括号中的表达式1的作用是初始化循环控制变量,即为循环控制变量赋初值;表达式2的作用是给出循环重复执行的判断条件,这个条件也用于决定什么时候结束循环;表达式3的作用是给循环控制变量增值,即定义循环控制变量在每次循环结束后按什么方式变化。
除了for语句,while和do-while语句也是循环语句。关于for语句:C语言for语句用法详解
在此循环中,让i赋初值1,当i < argc时进行循环,每一次循环后由i++令i+1,则i >= argc时结束循环,argc由用户输入参数个数决定,也就是在用户不输入其他参数情况下,循环不进行。
unsigned long dig = strtoul(argv[i], NULL, 16);
unsigned long,无符号长整型,long在32位机器为4个字节,在64位机器为8个字节,无符号即不会出现负数。定义一个无符号长整型变量(unsigned long),变量名为dig,并为其赋初值 strtoul(argv[i], NULL, 16),其中strtoul是将字符串转换成无符号长整型数,其头文件为stdlib.h。使用该函数即将用户输入的参数argv[i]以16进制的形式转换,再赋给dig。括号中的NULL表示该参数无效,或不使用该参数。
更多关于strtoul可参考:C语言strtoul()函数
putchar((char) dig);
putchar函数,作用是在屏幕上输出一个字符,基本格式为:putchar( c )。(char) dig表示将变量dig强制转化为字符型(char)。char为字符,字母,数字,汉字均可视为字符。关于字符还有许多拓展知识,可参考Char数据型态。在此程序中为输出dig变量的值。
更多可参考:C语言putchar()函数
}
putchar('\n');
输出换行符,即实现回车换行的功能。’\n’是一个转义字符,其余常见转义字符还有’\t’(横向跳到下一制表位置)等。
关于转义字符:C语言字符型数据(字符)
return 0;
}
主函数返回0表程序结束。
以下为该代码在ubantu上运行结果:
输入参数:30 31 32 33 34 35 36 37 38 39 输出为:0123456789
综上,该程序实现的是一种十六进制与字符串之间的转化.它将用户输入的数视为16进制,在进行字符串转化。其中30对应0,31对应1,32对应2…39对应9。
附:标准表
十六进制 | 缩写/字符 | 解释 |
---|---|---|
0x00 | NUL(null) | 空字符 |
0x01 | SOH(start of headline) | 标题开始 |
0x02 | STX (start of text) | 正文开始 |
0x03 | ETX (end of text) | 正文结束 |
0x04 | EOT (end of transmission) | 传输结束 |
0x05 | ENQ (enquiry) | 请求 |
0x06 | ACK (acknowledge) | 收到通知 |
0x07 | BEL (bell) | 响铃 |
0x08 | BS (backspace) | 退格 |
0x09 | HT (horizontal tab) | 水平制表符 |
0x0A | LF (NL line feed, new line) | 换行键 |
0x0B | VT (vertical tab) | 垂直制表符 |
0x0C | FF (NP form feed, new page) | 换页键 |
0x0D | CR (carriage return) | 回车键 |
0x0E | SO (shift out) | 不用切换 |
0x0F | SI (shift in) | 启用切换 |
0x10 | DLE (data link escape) | 数据链路转义 |
0x11 | DC1 (device control 1) | 设备控制1 |
0x12 | DC2 (device control 2) | 设备控制2 |
0x13 | DC3 (device control 3) | 设备控制3 |
0x14 | DC4 (device control 4) | 设备控制4 |
0x15 | NAK (negative acknowledge) | 拒绝接收 |
0x16 | SYN (synchronous idle) | 同步空闲 |
0x17 | ETB (end of trans. block) | 结束传输块 |
0x18 | CAN (cancel) | 取消 |
0x19 | EM (end of medium) | 媒介结束 |
0x1A | SUB (substitute) | 代替 |
0x1B | ESC (escape) | 换码(溢出) |
0x1C | FS (file separator) | 文件分隔符 |
0x1D | GS (group separator) | 分组符 |
0x1E | RS (record separator) | 记录分隔符 |
0x1F | US (unit separator) | 单元分隔符 |
0x20 | (space) | 空格 |
0x21 | ! | 叹号 |
0x22 | " | 双引号 |
0x23 | # | 井号 |
0x24 | $ | 美元符 |
0x25 | % | 百分号 |
0x26 | & | 和号 |
0x27 | ’ | 闭单引号 |
0x28 | ( | 开括号 |
0x29 | ) | 闭括号 |
0x2A | * | 星号 |
0x2B | + | 加号 |
0x2C | , | 逗号 |
0x2D | - | 减号/破折号 |
0x2E | . | 句号 |
0x2F | / | 斜杠 |
0x30 | 0 | 字符0 |
0x31 | 1 | 字符1 |
0x32 | 2 | 字符2 |
0x33 | 3 | 字符3 |
0x34 | 4 | 字符4 |
0x35 | 5 | 字符5 |
0x36 | 6 | 字符6 |
0x37 | 7 | 字符7 |
0x38 | 8 | 字符8 |
0x39 | 9 | 字符9 |
0x3A | : | 冒号 |
0x3B | ; | 分号 |
0x3C | < | 小于 |
0x3D | = | 等号 |
0x3E | > | 大于 |
0x3F | ? | 问号 |
0x40 | @ | 电子邮件符号 |
0x41 | A | 大写字母A |
0x42 | B | 大写字母B |
0x43 | C | 大写字母C |
0x44 | D | 大写字母D |
0x45 | E | 大写字母E |
0x46 | F | 大写字母F |
0x47 | G | 大写字母G |
0x48 | H | 大写字母H |
0x49 | I | 大写字母I |
0x4A | J | 大写字母J |
0x4B | K | 大写字母K |
0x4C | L | 大写字母L |
0x4D | M | 大写字母M |
0x4E | N | 大写字母N |
0x4F | O | 大写字母O |
0x50 | P | 大写字母P |
0x51 | Q | 大写字母Q |
0x52 | R | 大写字母R |
0x53 | S | 大写字母S |
0x54 | T | 大写字母T |
0x55 | U | 大写字母U |
0x56 | V | 大写字母V |
0x57 | W | 大写字母W |
0x58 | X | 大写字母X |
0x59 | Y | 大写字母Y |
0x5A | Z | 大写字母Z |
0x5B | [ | 开方括号 |
0x5C | |反斜杠 | |
0x5D | ] | 闭方括号 |
0x5E | ^ | 脱字符 |
0x5F | _ | 下划线 |
0x60 | ’ | 开单引号 |
0x61 | a | 小写字母a |
0x62 | b | 小写字母b |
0x63 | c | 小写字母c |
0x64 | d | 小写字母d |
0x65 | e | 小写字母e |
0x66 | f | 小写字母f |
0x67 | g | 小写字母g |
0x68 | h | 小写字母h |
0x69 | i | 小写字母i |
0x6A | j | 小写字母j |
0x6B | k | 小写字母k |
0x6C | l | 小写字母l |
0x6D | m | 小写字母m |
0x6E | n | 小写字母n |
0x6F | o | 小写字母o |
0x70 | p | 小写字母p |
0x71 | q | 小写字母q |
0x72 | r | 小写字母r |
0x73 | s | 小写字母s |
0x74 | t | 小写字母t |
0x75 | u | 小写字母u |
0x76 | v | 小写字母v |
0x77 | w | 小写字母w |
0x78 | x | 小写字母x |
0x79 | y | 小写字母y |
0x7A | z | 小写字母z |
0x7B | { | 开花括号 |
0x7C | l | 垂线 |
0x7D | } | 闭花括号 |
0x7E | ~ | 波浪号 |
0x7F | DEL (delete) | 删除 |