目录
前言
近些天学习发现C语言有一些以前从未注意过的知识,特此开一新篇记录学习中的心得,欢迎各位在评论补充,持续更新中......
1.在特定条件下可以直接输出进制转换
#include <stdio.h> int main() { int a=0xABCDEF; printf("%15d",a); return 0; }
上述代码可以直接输出十六进制转换成十进制的结果,源自于nowcoder基础题。
2.不同进制的输入及整体输出
描述
输入一个十六进制数a,和一个八进制数b,输出a+b的十进制结果(范围-231~231-1)。
输入描述:
一行,一个十六进制数a,和一个八进制数b,中间间隔一个空格。
输出描述:
一行,a+b的十进制结果。
#include <stdio.h> int main() { int a,b; scanf("%x %o",&a,&b); printf("%d",a+b); return 0; }
重点在于十六进制和八进制的输入方法
题源于nowcoder基础练习BC34
2023.4.21
3.易错点之字符串和数组?
(1)理解上的错误:
在学习中混用了字符串和数组,特在此记录:字符串数组的最后要带有"\0",而数字数组后没有,具体测试可以看如下程序:
#include <stdio.h> int main() { int arr[20]={1,2,3,4,5}; char str[20]={"hello"}; return 0; }
创建了一个字符串,一个数组,我们来调试具体看一下是怎么存储的
编辑
不难看出,str字符串后才有"\0",而数组则没有,这对我们有什么影响?
(2)有什么影响?
在计算大小的时候会有错误,例如下面代码:
#include <stdio.h> #include <string.h> int main() { int arr[] = { 1,2,3,4,5 }; int len1 = 0; int len2 = 0; len1 = sizeof(arr) / sizeof(arr[0]); len2 = strlen(arr); printf("len1=%d\nlen2=%d", len1, len2); return 0; }
那么运行结果如下:
编辑
从中可以发现,strlen函数来计算大小是有问题的,到一些文献里来细看strlen函数:
编辑
由此可以看到strlen函数对参数的要求是char * str,计算的是beginning of the string and the terminating null character(从开头到结尾的字符串终止符),并且without including the terminating null character itself(不包括结尾字符串"\0")。
(3)sizeof和strlen?
初学者往往仅局限于这两者都是用来计算大小的,但仅局限于此,下面是对这两个函数的一些补充
首先我们要明确的是,sizeof是C语言中保留关键字,也可以认为是一种运算符运算符,单目运算符。
sizeof实际上是获取了数据在内存中所占用的存储空间,以字节为单位来计数。
于是,就有了这样的情景:
#include <stdio.h> #include <string.h> int main() { int arr[] = { 1,2,3,4,5 }; char str[] = {"hello"}; int len1 = 0; int len2 = 0; len1 = sizeof(arr); len2 = sizeof(str); printf("len1=%d\nlen2=%d", len1, len2); return 0; }
由于sizeof计算的是数据在内存中占用的存储空间,因此len1和len2的结果是看数组/字符串的内容,注意,这里计算的时候str中是要算"\0"的存在的(空格也算)。
编辑
但若假设,我们规定了数组和字符串的大小:
#include <stdio.h> #include <string.h> int main() { int arr[10] = { 1,2,3,4,5 }; char str[10] = {"hello"}; int len1 = 0; int len2 = 0; len1 = sizeof(arr); len2 = sizeof(str); printf("len1=%d\nlen2=%d", len1, len2); return 0; }
运行结果就截然不同了:
编辑
这是因为,sizeof计算的是存储空间的大小,而这里和上面不同的是初始化了str和arr的大小,已经提前在内存中开辟了一定的空间,而又因为一般情况下char类型数据占一个字节,int类型占四个字节(也并不都是,一般用的windows下的编译器是这样规定的),因此结果就是4*10和1*10
2023.4.23