gets()的不安全性
在PAT的题目测试系统中,PAT B1009题,算法笔记于P97页的参考代码中,写下了gets(str)的代码,但是这条代码并不被PAT的测试系统所认可,后来发现是由于gets()的不安全性,已经被停用了。关于其不安全性的原因之后再做补充,解决方案如下:
const char *str;
string ss;
getline(cin,ss);
str = ss.c_str();
这样,就可以把string转换为char[]数组,方便了我们的处理。
C++中sizeof()求数组的大小
之前我利用网上的这种办法,试图求解出数组中的元素个数,代码如下:
int greedySelect(int s[], int f[], bool a[]){
int count = sizeof(s) / sizeof(s[0]);
return count;
}
后来发现不管怎么样,结果都是1,最后才知道上面形参虽然定义的是一个数组,使用sizeof()求大小时,就会退化为一个数组指针,实际上求得的是一个指针的大小,4字节,而一个int也是四字节,所以结果一直为1.
下面对sizeof()与strlen()之间的区别做一些详细讲解。
c/c++ strlen(str)和str.length()和str.size()都可以求字符串长度。
其中str.length()和str.size()是用于求string类对象的成员函数
strlen(str)是用于求字符数组的长度,其参数是char*。
举例:
1)char* ss = “0123456789”;
sizeof(ss)为4,ss是指向字符串常量的字符指针,sizeof 获得的是指针所占的空间,则为4
sizeof(*ss)为1,*ss是第一个char字符,则为1
2)char ss[] = “0123456789”;
sizeof(ss)为11,ss是数组,计算到’\0’位置,因此是(10+1)
sizeof(*ss)为1,*ss是第一个字符
3)char ss[100] = “0123456789”;
sizeof(ss)为100,ss表示在内存中预分配的大小,100*1
strlen(ss)为10,它的内部实现用一个循环计算字符串的长度,直到’\0’为止。
4)int ss[100] = “0123456789”;
sizeof(ss)为400,ss表示在内存中预分配的大小,1004
strlen(ss)错误,strlen参数只能是char,且必须是以’\0’结尾
5)char[] a={‘a’,‘b’,‘c’};
sizeof(a)的值应该为3。
char[] b={“abc”};
sizeof(b)的值应该是4。
若string str={‘a’,‘b’,‘c’,’\0’,‘X’};
那么sizeof(str)为5,strlen(str)为3。
sizeof()、strlen()两者区别:
- 1)sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
2)sizeof是运算符,strlen是函数。
3)sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以’’\0’'结尾的。
sizeof还可以用函数做参数,比如:
short f(); printf("%d\n", sizeof(f()));
输出的结果是sizeof(short),即2。
4)数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5)大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度。这就是sizeof(x)可以用来定义数组维数的原因
char str[20]=“0123456789”;
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
6)strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度,不是类型占内存的大小。
7)sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
8)当使用了一个结构类型或变量时, sizeof 返回实际的大小, 当使用一静态地空间数组, sizeof 返回全部数组的尺寸。sizeof 操作符不能返回被动态分配的数组或外部的数组的尺寸