当前位置: 首页 > 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

相关文章:

  • 实现分布式锁的方案与实战应用案例
  • 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)
  • dreamweaver cs6/网站优化seo推广服务
  • Dw怎么做网站往里面加标题和字/天津网站排名提升多少钱
  • 免费数据库网站空间/新闻稿发布
  • wordpress做购物网站/学新媒体运营最好的培训学校
  • p2p网站建设公司排名/吉林关键词排名优化软件
  • 烟台网站建设优化/白帽seo