一些字符串函数的记录 strlen snprintf sizeof memcpy strcpy
// 定义一个字符指针 str,并将其初始化为指向字符串常量 "12345"
char *str = "12345";
// 输出字符串 str 的长度(不包括末尾的空字符 '\0'),输出结果为 5
cout << strlen(str) << endl;
// 输出字符串 "12345" 的长度(不包括末尾的空字符 '\0'),输出结果为 5
cout << strlen("12345") << endl;
// 输出指针 str 的大小(在64位系统中通常是8字节),输出结果为 8
cout << sizeof(str) << endl;
// 输出字符串 "12345" 的大小(包括末尾的空字符 '\0'),输出结果为 6
cout << sizeof("12345") << endl;
// 定义一个字符数组 dest,大小为 5
char dest[5];
// 使用 snprintf 函数将 str 中的字符串复制到 dest 中,最多复制 4 个字符(包括末尾的空字符 '\0')
snprintf(dest, 5, "%s", str);
// 输出 dest 中的字符串,输出结果为 "1234"
cout << dest << endl;
// 输出 dest 中字符串的长度(不包括末尾的空字符 '\0'),输出结果为 4
cout << strlen(dest) << endl;
// 输出 dest 数组的大小,输出结果为 5
cout << sizeof(dest) << endl;
找gpt总结了下:
特性 | strlen() | sizeof |
---|
功能 | 计算字符串的长度(不包括 \0 ) | 计算对象或类型在内存中占用的总字节数 |
适用范围 | 仅适用于 C 风格字符串(const char* 或 char[] ) | 适用于任何类型(数组、指针、基本数据类型等) |
返回值 | 字符串中字符的数量(不包括 \0 ) | 内存占用的字节数 |
计算方式 | 扫描字符串直到 \0 字符 | 直接返回对象在内存中的大小 |
是否受数组类型影响 | 是的,strlen() 只计算字符串的字符长度,不包括 \0 | 是的,sizeof 对于数组返回整个数组的字节大小,包括 \0 |
对于指针的行为 | 计算指针所指向的 C 风格字符串的字符数(不包括 \0 ) | 计算指针本身的大小(通常是 4 字节或 8 字节,取决于平台架构) |
再来个memcpy和strcpy的对比
特性 | memcpy | strcpy |
---|---|---|
功能 | 复制任意数据类型的内存字节。 | 专门用于复制以 \0 结尾的字符串。 |
数据类型支持 | 任意类型,包括非字符串数据。 | 仅支持以 \0 结尾的字符串。 |
停止条件 | 根据指定的字节数 n 停止。 | 遇到 \0 时停止。 |
安全性 | 不处理 \0 ,用户需要手动处理字符串结束标志。 | 自动处理 \0 ,但目标数组大小不足会导致溢出。 |
效率 | 通常比 strcpy 更高效。 | 较低,因为需要检查 \0 。 |
适用场景 | 复制任意数据类型,特别是非字符串数据。 | 仅适用于复制字符串。 |
注意:
C字符串数组默认是未初始化的
char str[10];
str[0] = 'a';
尾部的9个字符是未初始化的。
当字符串用的时候,想要绝对安全,要么提前初始化一下再赋值。 char str[10]={0x00};
要么预留出足够空间,用snprintf、strncpy自动在尾部加一个 ‘\0‘
原文地址:https://blog.csdn.net/wks19891215/article/details/145231720
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!