8. 算法笔记——gets()的不安全性,sizeof()求数组大小

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. 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 操作符不能返回被动态分配的数组或外部的数组的尺寸
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值