自学内容网 自学内容网

一些字符串函数的记录 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的对比

特性memcpystrcpy
功能复制任意数据类型的内存字节。专门用于复制以 \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)!