引言
今天在看y总视频师对下面这串代码颇感兴趣:
#include <iostream> #include <string.h> using namespace std; int main() {
char s[1000]; gets(s); int n = strlen(s); for (int i = 0; i < n; i++) {
int j = i; while (j < n && s[j] != ' ') {
j++; } for(int k = i; k < j; k++) {
cout<<s[k]; } cout<<endl; } }
讯享网
这段代码有两个点引起了我的注意:
于是乎我上百度查了这两个函数的具体作用,得出结果如下:
一、gets函数
1.功能介绍
gets() 是 c++语言中用来输入一行字符串的函数,其原型为 char *gets( char *s )。该函数会一次性读入一行字符串,遇到换行符’\n’结束读入,并且会将读入的’\n’替换为’\0’。gets() 函数的参数是字符型指针,代表着要输入的字符串的首地址。
2.优点
①适用于输入较短的字符串,比如名字、年龄等。gets() 可以轻松地输入并存储短字符串,而不需要使用字符串缓冲区。
②gets() 很容易理解和使用,因为它是默认的 c++函数,不需要额外的库或工具。
③输入字符型数据时,gets() 比其他输入函数速度更快,因为它不需要将字符转换为数字,也不需要识别负号。
3.缺点
①gets() 不能输入超过字符数组大小的字符串,因为这会导致内存溢出,这是因为 gets() 函数没有将内存大小指定为输入字符的长度。
②输入未知长度的字符串时,使用 gets() 函数时需要小心。如果输入的字符串长度超出了字符数组的大小,则不仅会导致内存泄漏,而且还会破坏原来存储在该位置的数据。
③gets() 函数无法检查输入字符串的大小,因此输入的字符串可能会包含不安全的格式,例如格式字符串漏洞或缓冲区溢出漏洞。
示例代码:
讯享网#include <iostream> #include <string.h> using namespace std; int main() {
char str[20]; cout<<"请输入一个字符串:"; gets(str); cout<<"您输入的字符串为:"<<str; }
二、strlen函数
strlen函数是属于string.h库当中的,使用时记得调用该库。
1.strlen(const cr *s)返回的是字符串的长度。获得的是有效字符的长度,不包括末尾的结束符’\0’。
strlen函数的原型是:
unsigned int strlen(const char *str) {
assert(str != Null); unsigned int len = 0; while (*str++) {
len++; } return len; }
2.与sizeof的区别
sizeof是一个运算符,表示求对象在内存中占用的字节数。对于字符串求sizeof,则字符串末尾的‘\0’也要计算在内,占一个字节。
sizeof运算符参数可以是任何对象。而strlen函数的参数必须是const char*类型。
3.例子分析,下面是用strlen和sizeof的代码分析
讯享网#include <iostream> using namespace std; int main() {
char str[] = "hello,world"; char name[20] = "Jenny"; char *ch = "hello"; int len1 = strlen(str); int len2 = strlen(name); int len3 = strlen(ch); cout << "strlen:字符串长度 " << endl; cout << "str: " << len1 << endl; cout << "name: " << len2 << endl; cout << "ch: " << len3 << endl; cout << "sizeof: 内存字节数" << endl; cout << "str: " << sizeof(str) << endl;//这里对字符串末尾的\0是占用内存字节的,所以用sizeof求字节数比字符串长度大1. cout << "name: " << sizeof(name) << endl; cout << "ch: " << sizeof(ch) << endl;//因为ch是指针,指针是地址,是占用32位,也就是4个字节。与指针是何类型无关 return 0; }
输出结果:


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/70794.html