CSAPP基本版实验学习日志:关于hexify代码的阅读以及在ubantu上的运行

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语言中的exitmallocfree等函数。在此程序中用到了它的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。

附:标准表

十六进制缩写/字符解释
0x00NUL(null)空字符
0x01SOH(start of headline)标题开始
0x02STX (start of text)正文开始
0x03ETX (end of text)正文结束
0x04EOT (end of transmission)传输结束
0x05ENQ (enquiry)请求
0x06ACK (acknowledge)收到通知
0x07BEL (bell)响铃
0x08BS (backspace)退格
0x09HT (horizontal tab)水平制表符
0x0ALF (NL line feed, new line)换行键
0x0BVT (vertical tab)垂直制表符
0x0CFF (NP form feed, new page)换页键
0x0DCR (carriage return)回车键
0x0ESO (shift out)不用切换
0x0FSI (shift in)启用切换
0x10DLE (data link escape)数据链路转义
0x11DC1 (device control 1)设备控制1
0x12DC2 (device control 2)设备控制2
0x13DC3 (device control 3)设备控制3
0x14DC4 (device control 4)设备控制4
0x15NAK (negative acknowledge)拒绝接收
0x16SYN (synchronous idle)同步空闲
0x17ETB (end of trans. block)结束传输块
0x18CAN (cancel)取消
0x19EM (end of medium)媒介结束
0x1ASUB (substitute)代替
0x1BESC (escape)换码(溢出)
0x1CFS (file separator)文件分隔符
0x1DGS (group separator)分组符
0x1ERS (record separator)记录分隔符
0x1FUS (unit separator)单元分隔符
0x20(space)空格
0x21!叹号
0x22"双引号
0x23#井号
0x24$美元符
0x25%百分号
0x26&和号
0x27闭单引号
0x28(开括号
0x29)闭括号
0x2A*星号
0x2B+加号
0x2C,逗号
0x2D-减号/破折号
0x2E.句号
0x2F/斜杠
0x300字符0
0x311字符1
0x322字符2
0x333字符3
0x344字符4
0x355字符5
0x366字符6
0x377字符7
0x388字符8
0x399字符9
0x3A:冒号
0x3B;分号
0x3C<小于
0x3D=等号
0x3E>大于
0x3F?问号
0x40@电子邮件符号
0x41A大写字母A
0x42B大写字母B
0x43C大写字母C
0x44D大写字母D
0x45E大写字母E
0x46F大写字母F
0x47G大写字母G
0x48H大写字母H
0x49I大写字母I
0x4AJ大写字母J
0x4BK大写字母K
0x4CL大写字母L
0x4DM大写字母M
0x4EN大写字母N
0x4FO大写字母O
0x50P大写字母P
0x51Q大写字母Q
0x52R大写字母R
0x53S大写字母S
0x54T大写字母T
0x55U大写字母U
0x56V大写字母V
0x57W大写字母W
0x58X大写字母X
0x59Y大写字母Y
0x5AZ大写字母Z
0x5B[开方括号
0x5C|反斜杠
0x5D]闭方括号
0x5E^脱字符
0x5F_下划线
0x60开单引号
0x61a小写字母a
0x62b小写字母b
0x63c小写字母c
0x64d小写字母d
0x65e小写字母e
0x66f小写字母f
0x67g小写字母g
0x68h小写字母h
0x69i小写字母i
0x6Aj小写字母j
0x6Bk小写字母k
0x6Cl小写字母l
0x6Dm小写字母m
0x6En小写字母n
0x6Fo小写字母o
0x70p小写字母p
0x71q小写字母q
0x72r小写字母r
0x73s小写字母s
0x74t小写字母t
0x75u小写字母u
0x76v小写字母v
0x77w小写字母w
0x78x小写字母x
0x79y小写字母y
0x7Az小写字母z
0x7B{开花括号
0x7Cl垂线
0x7D}闭花括号
0x7E~波浪号
0x7FDEL (delete)删除
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值