笔试在线编程题目中关于字符数组等一些需要注意的地方和技巧

1、综述

        笔者最近正在参加2019年互联网公司提前批的校招,来自国内某985文科专业小硕,心仪的岗位准备投机器学习算法工程师。笔者也深深知道自己能力的欠缺。首先是coding能力还很欠缺,代码这种东西需要日积月累的不断去写、不断地去学习新的知识点在后来练习、在调试的过程中才能进步,发现自己不足的地方,并与志同道合的同行多交流。其次是机器学习算法工程师需要精通最起码常见的ML算法。比如lr、svm、决策树、k-means、knn、隐形马尔科夫、PCA、深度学习等等,在学习掌握这些理论地同时,最好去刷一些题目,笔者认为目前ML方面的练习题网站并没有软开的多,这里并非广告,推荐七月在线实验室网站,大家可以自行去百度里面搜索,下面言归正传,来说我们今天的话题。

2、字符数组中的坑

2.1 

        首先我们应该知道c语言中利用数组方式来存储字符,例如char fruit[6] = {'o','r','a','n','g','e'};这是一个长度为6的字符数组,但是并非一个字符串,因为C语言中规定,要在每一个字符串的结尾加一个“字符串结束标识”,以便系统能够判断这个字符串是否结束。c语言以字符'\0'作为字符串结束标识,所以只有在其后添加'\0'这个结束标识后,char型数组才能转化为字符串。例如:char fruit[7] = {'o','r','a','n','g','e','\0'}; 这个长度不是6个字符,而是7个字符,最后一个字符'\0',但在输出的时候不输出'\0',这是一个空字符,其ASCII码为0.

(1)需要再说的一些容错误的地方,首先是显式定义长度的情形

int main()
{
char a1[3] = {'1','2'};
cout << a1 << endl;
cout << sizeof(a1) << endl;
cout << strlen(a1) << endl;
cout << '\n' << endl;

char a2[3] = {'1','2','\0'};
cout << a2 << endl;
cout << sizeof(a2) << endl;
cout << strlen(a2) << endl;

system("pause");
    return 0;

}

运行结果:


这说明char a1[3] = {'1','2'}; 和char a2[3] = {'1','2','\0'};是一样的,就是对于字符数组来表示字符串,不管后面有没有显示地写'\0',这个'\0'都是存在的。还要注意的是字符串的长度不等于字符串的大小,因为我们可以看到strlen(a1) = 2,而sizeof(a1) = 3,这说明字符串的长度不包括'\0'这些,因为strlen()统计的长度也不含'\0'。

(2)接下来是隐式定义等长的情形,我们再来看下面这段代码

int main()
{
char a1[] = {'\0'};
//cout << a1 << endl;
cout << sizeof(a1) << endl;
cout << strlen(a1) << endl;
cout << '\n' << endl;


char a2[] = {'1'};
//cout << a2 << endl;
cout << sizeof(a2) << endl;
cout << strlen(a2) << endl;
cout << '\n' << endl;


char a3[128] = {'\0'};
//cout << a3 << endl;
cout << sizeof(a3) << endl;
cout << strlen(a3) << endl;


system("pause");
    return 0;

}

运行结果:


发现运行结果比较诡异,char a1[] = {'\0'},我们可以看到长度为0,大小为1,相当于定义了一个字符,初始化为'\0',这个char a3[128] = {'\0'},我们可以看到其长度为0,大小为128,相当于定义了128个字符,全部被初始化为'\0'。但是第二个char a2[] = {'1'},小哥我就不能理解了,按照小哥的理解应该是输出大小为2,长度为1的一个字符啊,但是运行的结果却是大小为12,长度为1,这个我就无法理解了,什么鬼,后来经过反复调试终于知道了些,char a2[] = {'1'}(char a2[1] = {'1'}也一样),这种不显式给定长度的就不是一个字符串,而是默认的字符数组,而strlen()是统计字符串的方法,故会得出奇怪的结论。

切记,重要的事情说三遍 ,不能定义一个非定长的数组!不能定义一个非定长的数组!不能定义一个非定长的数组!

我的建议就是以后用字符数组来表示字符串的时候,建议一定要显式给定数组的长度,并尽可能显式的给出最后的'/0'

char a4[] = {'a','b','c'}则也是一个字符串,其长度为3,大小为4,后面肯定有一个'\0'

2.2 关于cin

 一般只能接收字符串和数据,需要重载才能接收诸如vector等数据类型


猜你喜欢

转载自blog.csdn.net/qq_33221533/article/details/81040509