小知识汇总

1、关于如何将不同进制数赋值给变量(转载自 http://c.biancheng.net/cpp/html/1716.html )


c语言支持二进制、八进制、十进制和十六进制的计数系统,在表示一个数字时,用某个特殊的字符来区别其所属的计数系统是必要的。在表示 二进制数时,要在数字的末尾加上 “b”(如101b);在表示 八进制数时,要使用0作为开头 (如014);在表示 十六制数时,要使用 “0x”字符序列(如0x34);显然,在表示 十进制数时, 不需要任何标识符,因为十进制是缺省(默认)的计数系统。
要把一个十六进制的值赋给一个变量,你可以象下面这样做:
int x ;
x=0x20;                 /* put hex 20(32 in decimal) into x */
x='\0x20' ;                / * put the ASCII character whose value is
                                    hex 20 into x * /
把一个八进制的值赋给一个变量与把一个十六进制的值赋给一个变量一样简单:
int x ;
x=033;                 / * put octal 33 (decimal 27) into x * /
x='\033' ;               / * put the ASCII character whose value is
                                    octal 33 into x * /

但据自己在vs2017平台测试,二进制的编译通不过,八进制和十六进制的可以。


2、vs2017平台下的 fgets()函数和gets_s()函数
fgets(char *buf, int size, FILE *stream)
gets_s(char *buf, int size)
很明显fgets比gets_s的参数里多个文件(流)。
关键点:首先,先说明 '\n' 也是字符。
fgets函数最多只读 size - 1 个字符。如果读的 “不包含'\n'的字符” 少于size - 1,则也会将'\n'读进来,然后在'\n'的后面加个'\0',再后面就是随机值(如果是通过malloc创建的话)了。如果读的 “不包含'\n'的字符” 等于initial_value - 1 个字符,则会截断最后的'\n',然后将最后一个字节置为'\0'。
然后gets_s函数一样,最多只读 size - 1 个字符,但跟fgets函数不同的是,它不读 '\n',它会自动把 '\n' 换成 '\0',同时,如果输入的字符数大于 size -1 的话,它就会崩溃,而不是跟fgets函数一样去截断。

3、关于realloc,realloc函数重新分配指针指向内存空间的大小,如果新的大小太大,它就会在内存里重新找个地方,然后通过返回值的形式,返回新的内存。并不会自动修改原先的指针指向新的内存。
例:
char *p = (char *)malloc(10);//此时,指针p就指向此内存。
p = (char *)realloc(p, 200); //一般情况,系统都会在内存里重新找个地方给此内存。找完后,系统并不会隐式自动修改p的值,去指向新的内存。需要自己显式的通过接受realloc的返回值来修改p的值。

4、所有的注释都会被预处理器拿掉,取而代之的是空格!//好像没什么用,但小知识挺有意思。

5、 char *strtok(char s[], const char *delim);
char string[] = "A string\tof ,,tokens\nand some  more tokens";
char seps[] = " ,\t\n";
char *token;

int main(void)
{
	printf("Tokens:\n");

	// Establish string and get the first token:
	token = strtok(string, seps); // C4996
								  // Note: strtok is deprecated; consider using strtok_s instead
	while (token != NULL)
	{
		// While there are tokens in "string"
		printf(" %s\n", token);

		// Get next token: 
		token = strtok(NULL, seps); // C4996
	}

	//string[1] = ',';
	printf("%s\n", string);
}
关键点:第一次传的s必须是个实际存在的字符串。后面的都是NULL。
第一次将s字符串传给strtok,它内部会有个指针SAVE_PTR,指向此字符串的首地址。
进入这个函数,它先会将SAVE_PTR指针的值作为返回值保存着。然后让SAVE_PTR指针往后走,直到遇到delim里的任意一字符,然后将s字符串里的这个字符修改(真正的修改掉)为‘\0’,然后让SAVE_PTR指针指向'\0'的下一个位置,然后返回开始保存的那个SAVE_PTR值。如果SAVE_PTR指针走着走着遇到了'\0',还是先返回开始保存的那个SAVE_PTR的值,(下来的都是个人猜想)然后将SAVE_PTR指针的值置为NULL,这样在它下次进入时,一看SAVE_PTR的值是NULL,它就会直接返回NULL了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值