当前位置: 首页 > news >正文

c语言strcat和strlen的注意事项

1 .strlen

C库函数size_t strlen(const char* str)计算字符串str的长度,直到空字符,不包括空字符。在C语言中,字符串实际上是使用空字符\0结尾的一维字符数组。空字符(Null character)又称结束符,缩写NUL,是一个数值为0的控制字符,\0是转义字符,意思是告诉编译器,这不是字符0,而是空字符。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char str[10];
    str[0] = 0;
    printf("strlen(str):%d\n",strlen(str));
    printf("%s\n",str);//此时str是一个空字符串
    //sizeof(str)返回的是字符数组的大小
    printf("sizeof(str):%d\n",sizeof(str));
    return 0;
}

输出

strlen(str):0

sizeof(str):10

再看把str设置为长度为9的字符串的情况

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char str[10]="123456789";
    printf("strlen(str):%d\n",strlen(str));
    printf("%s\n",str);//此时str是一个空字符串
    //sizeof(str)返回的是字符数组的大小
    printf("sizeof(str):%d\n",sizeof(str));
    if(str[9] == 0)
        printf("str[9] is NUL");
    return 0;
}

输出

strlen(str):9
123456789
sizeof(str):10
str[9] is NUL

如果不给空字符留一个位置,会报错:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char str[10]="1234567899";
    printf("strlen(str):%d\n",strlen(str));
    printf("%s\n",str);//此时str是一个空字符串
    //sizeof(str)返回的是字符数组的大小
    printf("sizeof(str):%d\n",sizeof(str));
    if(str[9] == 0)
        printf("str[9] is NUL");
    return 0;
}

报错:

main.cpp:6:18: error: initializer-string for char array is too long
    char str[10]="1234567899";
                 ^~~~~~~~~~~~
main.cpp:7:31: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat]
    printf("strlen(str):%d\n",strlen(str));
                        ~~    ^~~~~~~~~~~
                        %zu
main.cpp:10:31: warning: format specifies type 'int' but the argument has type 'unsigned long' [-Wformat]
    printf("sizeof(str):%d\n",sizeof(str));
                        ~~    ^~~~~~~~~~~
                        %lu
2 warnings and 1 error generated.

2.strcat

strcat函数原型是char *strcat(char *dest,const char *src)。

传入的dest必须是以NUL结尾的合法的字符串。如果dest不是以NUL结尾的字符串,会导致未定义行为,具体效果看编译器的实现。

错误示例:

#include <stdio.h>
#include <string.h>

int main() {
    char str1[10];
    for(int i = 0;i < 10;i++)
        str1[i] = -1;
    char str2[10] = "123456789";
    //错误示例
    strcat(str1,str2);
    printf("str1:%s\n",str1);
    return 0;
}

Ubuntu 20.04.6 LTS +gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0,效果如下:

str1:����������123456789123456789
*** stack smashing detected ***: terminated
Aborted

http://www.dtcms.com/a/103936.html

相关文章:

  • 实现分布式锁的方案与实战应用案例
  • PP-ChatOCRv3新升级:多页PDF信息抽取支持自定义提示词工程,拓展大语言模型功能边界
  • 【深度学习新浪潮】什么是推理模型?
  • spring boot中“编程式事务”与“声明式事务”对比
  • day18 学习笔记
  • leetcode146.LRU缓存
  • 全球消费理性化浪潮下:跨境电商品牌溢价体系面临重构
  • 深入解析异构计算:从原理到 C++ 实践
  • ubuntu22.04 如何安装 ch341 驱动
  • MySQL-触发器
  • QT基础:安装与简介
  • Unity插件SuperScrollView详解
  • 端到端语音识别案例
  • Docker部署sprintboot后端项目
  • Android 系统中,应用申请的权限相关信息介绍
  • 一文详解QT环境搭建:Windows使用CLion配置QT开发环境
  • 深度学习-153-DeepSeek之调用远程大模型API接口和可用的开源Deepseek服务
  • C#实现HTTP服务器:处理文件上传---解析MultipartFormDataContent
  • 26考研——线性表_ 线性表的链式表示_单链表(2)
  • OpenCV 图形API(或称G-API)(1)
  • 周学习总结
  • 本地后台运行redis服务
  • SpringMVC 拦截器(Interceptor)
  • 渗透测试:登录页面的测试-弱口令思路和实战
  • 计算机网络知识汇总
  • 【水印】水印识别的算法方案思考
  • 机器学习的一百个概念(5)数据增强
  • 习题2.2
  • 06-02-自考数据结构(20331)- 查找技术-动态查找知识点
  • C#: 输入(Console.ReadLine())和输出(Console.WriteLine())