C语言从头学31——与字符串变量相关的几个函数

strlen、strcpy、strcat、strcmp、sprintf这些函数都是与字符串相关的,除了sprintf是定义在stdio.h中外,其余几个都定义在string.h中,比较新的编译器版本stdio.h中已经含有string.h的内容,所以编程时不需要再包含string.h这个头文件。 但由于版本不同,如某个函数编译器不能识别,则请包含string.h头文件。

1、strlen()

函数strlen的功能是返回字符串的字符长度 (不包括字符串末尾的 "\0" )。

使用格式:strlen (参1);

参1:字符串指针、字符串常量

返回值:size_t 类型的无符号整数 (一般可理解成是int,也可用int型强转)

用法举例:

char* str = "C语言从头学"; //写成str[]或str[1024]不影响结果

int num = strlen(str); //结果:11 (一个汉字2个字节加上字母C)

说明:

注意区分 strlen 和 sizeof 的区别,如下:

char s[]="a"; strlen返回1,sizeof返回2( 包括\0 )

char s[1024]="a"; strlen返回1,sizeof返回1024(声明的长度)

char* s="a"; strlen返回1,sizeof返回4或8(sizeof返回的是指针变量的字节长度,系统不同有所区别)

所以,当我们需要的是字符串的具体长度时,还是使用strlen为好。

2、strcpy()

函数 strcpy 的功能是为字符串数组赋值。(字符串数组不能使用等号 "=" 赋值<初值除外>,这个函数是通过复制内存地址的方法将一个字符串变量拷贝给另一个)

使用格式:strcpy(参1,参2);

参1 目标字符串变量(字符数组形式)

参2 源字符串(常量、数组变量、指针)

返回值:指向参1 的char*指针

用法举例:

char* str="C语言从头学";

// 写成 str[] 或 str[1024]也可,只要实际字符串长度(开始至"\0")小于目标变量声明长度即可正常完成复制

char s[1024]; //声明的目标字符串变量(字符数组)

strcpy(s,str);

说明:

a.目标变量声明的字节长度必须大于等于源字符串长度strlen()+1(1是考虑 \0 所占位置);strcpy不对目标、源两个变量的长度进行比较,这一点必须注意。

b.目标变量不能使用 char* 声明的变量。

c.这个函数的重要用途之一就是修改字符数组的值,除了声明时可用 "=" 赋初值外,其它场合都不能用 "=" 赋值,除非一个字符一个字符的修改。

3、strcat()

函数 strcat 的功能是连接字符串(将参2接续到参1结尾)

使用格式:strcat(参1,参2);

参1 字符串变量(字符数组名)

参2 字符串(常量、数组变量、指针)

返回值:指向参1 的 char* 型指针

用法举例:

char str[1024]="C语言从头学";

char* s="有必要。";

strcat(str,s); //str的值:C语言从头学有必要。

说明:

参数1的声明长度应能包含参2的长度,否则一旦溢出容易造成运行错误。

4、strcmp()

函数strcmp的功能是比较两个字符串的大小。

使用格式:strcmp(参1,参2);

参1、参2: 字符串(常量、数组变量名、指针)

返回值:参1、参2相同返回值为 0;参1>参2 返回值大于0;参1<参2 返回值小于0。

用法举例:

char* s1="abcd";

char* s2="bcde";

int ret=strcmp(s1,s2); //ret=-1

说明:

a. 参数只能是字符串可以包括指针、数组、常量等形式,但不能将字符型(char)做参数。

b. 英文字符按照ASCII码值比较,中文按汉语拼音比较。

5、sprintf()

函数sprintf功能是将数据写入字符串,使用方法与printf相似,不同之处在于printf是输出到屏幕,而sprintf是输出到一个字符串中。

使用格式:sprintf (参1,参2,参3);

参1 字符串指针(字符数组名)

参2 由包括占位符组成的字符串格式(占位符可有多个)

参3 与占位符对应的字符串变量或常量

返回值:返回写入变量的字符数量(不含尾部的\0),如遇到错误,返回负值。

用法举例:

char s1[] = "aaaa";

char* s2 = "bbbb";

char s[1024];

sprintf(s, "%s %s", s1, s2); //s中保存的是"aaaa bbbb"

说明:

新一些的编译器可能认为sprintf函数不安全,会报错。处理办法:a.在代码最前面加#define _CRT_SECURE_NO_WARNINGS屏蔽报错;或者使用sprintf_s替代,sprintf_s的参数增加了一个,即第二参数是参1 的大小,其余参数没变。(类似的函数不少,处理办法大同小异)

sprintf函数不仅仅可以将其它字符数据写入到字符串变量中,实际上包括int、double等凡是占位符具有的类型都可以嵌入到字符串变量中去。

6、前面几个函数使用举例:

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS //避免编译器对sprintf函数报错
#include<stdio.h>
int main(void)
{
//一、strlen的使用
    char str[20] = "C语言从头学";
    int count = strlen(str); //调用strlen函数计算str字节长度并将返回值赋给count
    printf("str的字节长度:%d个字节\n", count);
//二、strcpy的使用
    char strBak[20]; //声明的目标字符串变量字节长度要大于源变量
    strcpy(strBak, str); //将字符串变量str的值拷贝给strBak)
    printf("strBak的值为:%s\n", strBak);
//三、strcat的使用
    char str2[] = "有必要。";
    strcat(str,str2);
    printf("str现在的值是:%s\n",str);
//四、strcmp的使用
    char s1[] = "dddd";
    char* s2 = "bbbb";
    int a = strcmp(s1,s2);
    if (a < 0)printf("s1小于s2\n");
    if (a == 0)printf("s1等于s2\n");
    if (a > 0)printf("s1>s2\n");
//五、sprintf的使用
    char data[1024];
    char* data1 = "今天是";
    int data2 = 2024;
    char data3[] = "年";
    int data4 = 5;
    char data5[3] = "月";
    int data6 = 20;
    char* data7 = "日";
    sprintf(data, "%s%i%s%i%s%i%s", data1,data2,data3,data4,data5,data6,data7);
    printf("%s\n",data);

    getchar();
    return 0;
}

运行结果:

str的字节长度:11个字节

strBak的值为:C语言从头学

str现在的值是:C语言从头学有必要。

s1>s2

今天是2024年5月20日

相关推荐
物联网嵌入式小冉学长7 分钟前
10.C S编程错误分析
c语言·stm32·单片机·算法·嵌入式
不过四级不改名67721 小时前
用c语言实现简易c语言扫雷游戏
c语言·算法·游戏
我命由我123451 天前
嵌入式 STM32 开发问题:烧录 STM32CubeMX 创建的 Keil 程序没有反应
c语言·开发语言·c++·stm32·单片机·嵌入式硬件·嵌入式
C++ 老炮儿的技术栈1 天前
手动实现strcpy
c语言·开发语言·c++·算法·visual studio
xtmatao1 天前
正整数的正向分解
c语言
whoarethenext1 天前
使用C/C++的OpenCV 构建人脸识别并自动抓拍系统
c语言·c++·opencv
Navigator_Z1 天前
LeetCode //C - 757. Set Intersection Size At Least Two
c语言·算法·leetcode
几道之旅1 天前
零基础RT-thread第二节:按键控制
c语言·stm32
Jay_5151 天前
C语言环形数组(循环队列)详解:原理、实现与应用
c语言·学习·嵌入式·环形数组
jmlinux1 天前
从 C 语言计算器到串口屏应用
c语言·开发语言