C语言学习(四)——字符串处理函数

2023-11-04

字符串处理函数(17个)


1) gets()

#include <stdio.h>

char *gets(char *s);

功能

从标准输入读入字符,并保存到s指定的内存空间,直到出现换行符或读到文件结尾为止。

参数

s:字符串首地址

返回值

成功:读入的字符串

失败:NULL

gets(str)与scanf(“%s”,str)的区别:

  1. gets(str)允许输入的字符串含有空格
  2. scanf(“%s”,str)不允许含有空格

注意: 

由于scanf()和gets()无法知道字符串s大小,必须遇到换行符或读到文件结尾为止才接收输入,因此容易导致字符数组越界(缓冲区溢出)的情况。

char str[100];

printf("请输入str: ");

gets(str);

printf("str = %s\n", str);

 

2) fgets()

#include <stdio.h>

char *fgets(char *s, int size, FILE *stream);

功能

从stream指定的文件内读入字符,保存到s所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size - 1个字符为止,最后会自动加上字符 '\0' 作为字符串结束。

参数

s:字符串

size:指定最大读取字符串的长度(size - 1)

stream:文件指针,如果读键盘输入的字符串,固定写为stdin

返回值

成功:成功读取的字符串

读到文件尾或出错: NULL

注意:

fgets()在读取一个用户通过键盘输入的字符串的时候,同时把用户输入的回车也做为字符串的一部分。通过scanf和gets输入一个字符串的时候,不包含结尾的“\n”,但通过fgets结尾多了“\n”。fgets()函数是安全的,不存在缓冲区溢出的问题。

char str[100];

printf("请输入str: ");

fgets(str, sizeof(str), stdin);

printf("str = \"%s\"\n", str);

3) puts()

#include <stdio.h>

int puts(const char *s);

功能

标准设备输出s字符串,在输出完成后自动输出一个'\n'

参数

s:字符串首地址

返回值

成功:非负数

失败:-1

#include <stdio.h>

int main()

{

    printf("hello world");

    puts("hello world");

    return 0;

}

4) fputs()

#include <stdio.h>

int fputs(const char * str, FILE * stream);

功能:

将str所指定的字符串写入到stream指定的文件中, 字符串结束符 '\0'  不写入文件。

参数:

str:字符串

stream:文件指针如果字符串输出到屏幕,固定写为stdout

返回值:

成功:0

失败:-1

注意:

fputs()是puts()的文件操作版本,但fputs()不会自动输出一个'\n'

printf("hello world");

puts("hello world");

fputs("hello world", stdout);

5) strlen()

#include <string.h>

size_t strlen(const char *s);

功能

计算指定指定字符串s的长度,不包含字符串结束符‘\0’

参数

s:字符串首地址

返回值

字符串s的长度,size_t为unsigned int类型

char str[] = "abcdefg";

int n = strlen(str);

printf("n = %d\n", n);

6) strcpy()

#include <string.h>

char *strcpy(char *dest, const char *src);

功能

把src所指向的字符串复制到dest所指向的空间中,'\0'也会拷贝过去

参数

dest:目的字符串首地址

src:源字符首地址

返回值

成功:返回dest字符串的首地址

失败:NULL

注意:

如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况。

char dest[20] = "123456789";

char src[] = "hello world";

strcpy(dest, src);

printf("%s\n", dest);

7) strncpy()

#include <string.h>

char *strncpy(char *dest, const char *src, size_t n);

功能

把src指向字符串的前n个字符复制到dest所指向的空间中,是否拷贝结束符看指定的长度是否包含'\0'

参数

dest:目的字符串首地址

src:源字符首地址

n:指定需要拷贝字符串个数

返回值

成功:返回dest字符串的首地址

失败:NULL

char dest[20] ;

char src[] = "hello world";


strncpy(dest, src, 5);

printf("%s\n", dest);


dest[5] = '\0';

printf("%s\n", dest);

8) strcat()

#include <string.h>

char *strcat(char *dest, const char *src);

功能

将src字符串连接到dest的尾部,‘\0’也会追加过去

参数

dest:目的字符串首地址

src:源字符首地址

返回值

成功:返回dest字符串的首地址

失败:NULL

char str[20] = "123";

char *src = "hello world";

printf("%s\n", strcat(str, src));

9) strncat()

#include <string.h>

char *strncat(char *dest, const char *src, size_t n);

功能

将src字符串前n个字符连接到dest的尾部,‘\0’也会追加过去

参数

dest:目的字符串首地址

src:源字符首地址

n:指定需要追加字符串个数

返回值

成功:返回dest字符串的首地址

失败:NULL

char str[20] = "123";

char *src = "hello world";

printf("%s\n", strncat(str, src, 5));

10) strcmp()

#include <string.h>

int strcmp(const char *s1, const char *s2);

功能

比较 s1 和 s2 的大小比较的是字符ASCII码大小

参数

s1:字符串1首地址

s2:字符串2首地址

返回值

相等:0

大于:>0

小于:<0

char *str1 = "hello world";

char *str2 = "hello mike";

if (strcmp(str1, str2) == 0)

{

    printf("str1==str2\n");

}

else if (strcmp(str1, str2) > 0)

{

    printf("str1>str2\n");

}

else

{

    printf("str1<str2\n");

}

11) strncmp()

#include <string.h>

int strncmp(const char *s1, const char *s2, size_t n);

功能

比较 s1 和 s2 前n个字符的大小比较的是字符ASCII码大小

参数

s1:字符串1首地址

s2:字符串2首地址

n:指定比较字符串的数量

返回值

相等:0

大于: > 0

小于: < 0

char *str1 = "hello world";

char *str2 = "hello mike";

if (strncmp(str1, str2, 5) == 0)

{

    printf("str1==str2\n");

}

else if (strcmp(str1, "hello world") > 0)

{

    printf("str1>str2\n");

}

else

{

    printf("str1<str2\n");

}

12) sprintf()

#include <stdio.h>

int sprintf(char *_CRT_SECURE_NO_WARNINGS, const char *format, ...);

功能

根据参数format字符串来转换并格式化数据,然后将结果输出到str指定的空间中,直到出现字符串结束符 '\0'  为止。

参数

str:字符串首地址

format:字符串格式,用法和printf()一样

返回值

成功:实际格式化的字符个数

失败: - 1

char dst[100] = { 0 };

int a = 10;

char src[] = "hello world";

printf("a = %d, src = %s", a, src);

printf("\n");



int len = sprintf(dst, "a = %d, src = %s", a, src);

printf("dst = \" %s\"\n", dst);

printf("len = %d\n", len);

13) sscanf()

#include <stdio.h>

int sscanf(const char *str, const char *format, ...);

功能

从str指定的字符串读取数据,并根据参数format字符串来转换并格式化数据。

参数

str:指定的字符串首地址

format:字符串格式,用法和scanf()一样

返回值

成功:参数数目,成功转换的值的个数

失败: - 1

char src[] = "a=10, b=20";

int a;

int b;

sscanf(src, "a=%d,  b=%d", &a, &b);

printf("a:%d, b:%d\n", a, b);

14) strchr()

#include <string.h>

char *strchr(const char *s, int c);

功能

在字符串s中查找字母c出现的位置

参数

s:字符串首地址

c:匹配字母(字符)

返回值

成功:返回第一次出现的c地址

失败:NULL

char src[] = "ddda123abcd";

char *p = strchr(src, 'a');

printf("p = %s\n", p);

15) strstr()

#include <string.h>

char *strstr(const char *haystack, const char *needle);

功能

在字符串haystack中查找字符串needle出现的位置

参数

haystack:源字符串首地址

needle:匹配字符串首地址

返回值

成功:返回第一次出现的needle地址

失败:NULL

char src[] = "ddddabcd123abcd333abcd";

char *p = strstr(src, "abcd");

printf("p = %s\n", p);

16) strtok()

#include <string.h>

char *strtok(char *str, const char *delim);

功能

来将字符串分割成一个个片段。当strtok()在参数s的字符串中发现参数delim中包含的分割字符时, 则会将该字符改为\0 字符,当连续出现多个时只替换第一个为\0。

参数

str:指向欲分割的字符串

delim:为分割字符串中包含的所有字符

返回值

成功:分割后字符串首地址

失败:NULL

  1. 在第一次调用时:strtok()必需给予参数s字符串
  2. 往后的调用则将参数s设置成NULL,每次调用成功则返回指向被分割出片段的指针
char a[100] = "adc*fvcv*ebcy*hghbdfg*casdert";

char *s = strtok(a, "*");//将"*"分割的子串取出

while (s != NULL)

{

    printf("%s\n", s);

    s = strtok(NULL, "*");

}

17) atoi()

#include <stdlib.h>

int atoi(const char *nptr);

功能 

atoi()会扫描nptr字符串,跳过前面的空格字符,直到遇到数字或正负号才开始做转换,而遇到非数字或字符串结束符('\0')才结束转换,并将结果返回返回值。

参数

nptr:待转换的字符串

返回值:成功转换后整数

类似的函数有:

  1. atof():把一个小数形式的字符串转化为一个浮点数。
  2. atol():将一个字符串转化为long类型
char str1[] = "-10";

int num1 = atoi(str1);

printf("num1 = %d\n", num1);



char str2[] = "0.123";

double num2 = atof(str2);

printf("num2 = %lf\n", num2);

 


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言学习(四)——字符串处理函数 的相关文章

  • 排序和复杂度

    常见的排序方式 1 冒泡排序 时间复杂度 最好情况是 O n 最坏情况是 O n2 空间复杂度 开辟一个空间交换顺序O 1 2 快速排序 时间复杂的 最好情况是 O nlogn 最坏情况是 O n2 空间复杂度 最好的情况 每一次base值
  • C语言-01

    以下内容为个人笔记 无实际参考意义 取地址符 int a 9 int pa 9 定义了一个今天类型的变量a 给他的值为9 定义了一个int类型的指针pa 指向变量a的地址 指定a输出的结果为9 指定 a输出的结果为存放a变量的地址 指定pa
  • C语言常量、变量、标识符

    一 变量概述 变量是一个保存数据的地方 当我们需要在程序里保存数据时 就需要一个变量来保存它 变量定义的一般形式就是 lt 类型名称 gt lt 变量名称 gt 例如 int price int amount int price amoun
  • C语言学习记录——项目1 交换机后台管理之登录菜单(1)

    C语言学习记录 项目1 交换机后台管理之登录菜单 1 交换机 交换机 Switch 是一种用于电 光 信号转发的网络设备 它可以为接入交换机的任意两个网络节点提供独享的电信号通路 最常见的交换机是以太网交换机 其他常见的还有电话语音交换机
  • 【C语言】 getchar()与EOF的疑难杂症

    C语言程序设计 大师写的书本 需要字斟句酌 在接触到getchar 和EOF 文件结束符 感觉到疑惑 特此记录下来 一 getchar 总结如下 1 getchar是以行为单位进行存取的 当调用getchar函数读取输入时 只有当输入字符为
  • 【模拟】Redraiment的遭遇

    描述 Redraiment的老家住在工业区 日耗电量非常大 是政府的眼中钉肉中刺 但又没办法 这里头住的可都是纳税大户呀 今年7月 又传来了不幸的消息 政府要在7 8月对该区进行拉闸限电 但迫于压力 限电制度规则不会太抠门 政府决定从7月1
  • C语言学习:运算符和表达式

    算数运算符 自增 自减运算符 作用是让变量的值加1减1 i 在使用i之前加一 i 在使用i之后加一 这种运算符只能用于变量 常常用在循环语句哪里 也用于指针变量 是指针指向下一个地址 算数优先级 一个数两边都有运算符 那么先考虑优先级 如果
  • 自定义类型:结构体

    C语言之自定义类型 结构体 文章目录 C语言之自定义类型 结构体 前言 1 结构体 1 1 结构体声明 1 1 1 一般格式 1 1 2 特殊结构体声明 1 2 结构的自引用 1 3 结构体变量的定义和初始化 1 4 结构体内存对齐 1 4
  • Linux下 C语言实现消息队列

    消息队列 Unix的通信机制之一 可以理解为是一个存放消息 数据 容器 将消息写入消息队列 然后再从消息队列中取消息 一般来说是先进先出的顺序 可以解决两个进程的读写速度不同 处理数据速度不同 系统耦合等问题 而且消息队列里的消息哪怕进程崩
  • 单词统计(C语言)

    简述 输入一串英文字符串 统计出现的单词数目 流程图 原理简述 定义一个字符串数组char a 100 用于接收输入的字符串 输入字符串本处运用的gets 函数 作用是从终端输入一串字符到定义的字符数组中 函数返回值是数组地址 为方便表示
  • c提高学习——(字符串强化_查找字串)实现strstr

    先简单的看一下strstr的用法 include
  • 编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入。

    编写一个程序 提示用户输入一周工作的小时数 然后打印工资总额 税金和净收入 首先做如下假设 基本工资 10 00美元 小时 加班 超过40小时 1 5倍的时间 税率 前300美元为15 续150美元为20 余下的为25 用 define定义
  • 用一个数组实现两个栈(共享栈)

    共享栈 一个数组实现两个栈 第一个栈是开头 第二个栈是结尾 用c语言实现 很简单 两个指针一个数组就够了 上代码 define CRT SECURE NO WARNINGS 1 include
  • C语言问题:0xC0000005: 写入位置 0xFFFFFFCC 时发生访问冲突。

    最近系统地开始学习C语言 在使用VS2019中用scanf s为一串字符串赋值时 发生了错误 错误如下 0x7837EF8C ucrtbased dll 处 位于 Project2 exe 中 引发的异常 0xC0000005 写入位置 0
  • C语言:初阶指针和结构体

    1 指针是什么 指针理解的两个要点 指针是内存中的一个最小单元的编号 也就是地址 平时口语说的指针 通常指的是指针变量 是用来存放内存地址的变量 为了管理计算机内存空间 会把内存分为一个一个一个小的内存单元 每个内存单元占一个字节的空间 那
  • 【简单】阶乘之和

    描述 给定n的值 求Sn 1 2 3 4 5 n 之值 但Sn可能很大 因此只要求出Sn关于100007的余数 输入 输入数据有多组 每组占一行 每行一个正整数n n lt 1000 输出 每组输出一个整数 即Sn Mod 100007 样
  • C语言中关键字const、static、volatile的用法分析

    1 const 作为一个程序员 我们看到关键字const时 首先想到的应该是 只读 因为 它要求其所修饰的对象为常量 不可对其修改和二次赋值操作 不能作为左值出现 看几个例子 const int a 同上面的代码行是等价的 都表示一个常整形
  • C语言动态内存开辟,malloc,calloc,free,realloc函数使用

    目录 一 内存的动态分配 1 函数malloc 2 函数calloc 3 函数realloc 4 函数free 关于动态内存错误的操作案例 一 内存的动态分配 1 函数malloc 函数原型 void malloc size t size
  • 求字符串长度的三种方法(C语言)

    如何求字符串的长度 首先要明白字符串存储的原理 字符串存储时 是以 0 结尾 这个就可以作为判断字符串结尾的一个条件 接下来 只要有字符串的首元素地址 就可以解决求字符串长度的问题啦 第一种 普通版 int my strlen char s
  • 6-3 求3*3整数矩阵对角线元素之和

    include

随机推荐

  • SpringBoot第16讲:如何生成接口文档之Swagger技术栈

    SpringBoot第16讲 如何生成接口文档之Swagger技术栈 SpringBoot开发Restful接口 有什么API规范吗 如何快速生成API文档呢 Swagger 是一个用于生成 描述和调用 RESTful 接口的 Web 服务
  • `算法知识` 笛卡尔坐标系, 边长与边权, 曼哈顿距离, 欧几里得距离,外接矩形

    catalog 图像引用 图一 图二 笛卡尔坐标系的 边长 与 边权 曼哈顿距离 曼哈顿边权 与 欧几里得距离 的转换 凸多边形的曼哈顿周长 与 外接矩形的欧几里得周长 例题 ID COUNT 4 跳转链接已经使用了 0 ID COUNT
  • kali中binwalk/foremost/zip2john工具的配合使用

    kali中binwalk foremost zip2john工具的配合使用 背景 通过binwalk工具观察该文件是否包含其他文件 通过foremost工具将隐藏文件提取出来 通过zip2john工具破解压缩包的密码 心得体会 背景 最近参
  • 魏副业而战:开学季,闲鱼卖什么好?

    我是魏哥 与其躺平 不如魏副业而战 现在八月底了 意味着暑假结束 新的学期将要开始 作为闲鱼卖家 可顺势布局一下 那卖什么好呢 开学季嘛 卖学习相关的 例如 文具 书包 练习本 教辅书籍等等 只要和学生相关的都可以的 另外 有些大学生可能会
  • oracle 连接串解释

    工作中 oracle环境 常常通过连接串描述 scott 123456 DESCRIPTION ADDRESS PROTOCOL TCP HOST 192 168 206 100 PORT 1521 CONNECT DATA SERVER
  • 小孩学机器人编程怎么样

    小孩学机器人编程怎么样 孩子的学习从古至今都是家长们十分关心和重视的一件事情 很多的家长在培养孩子的学习方面也是相当耐心的 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 他们对于小孩学机器人编程怎么样并不是很清楚 今天我们就一起来了
  • sqli-labs靶场Less-3

    1 访问首页 index php id 1 这里的传参点是id 2 判断注入点是数字还是字符 如果是字符就需要闭合 and 1 1 qwe and 1 2 qwe 分析 通过以上探测发现并不起效果 考虑是不是和第一关一样需要单引号闭合 再次
  • 如何用一根网线实现在两台电脑之间传输数据

    下面我来说一说怎样用一根网线连接两台电脑 从而实现数据的传输 首先 我们要在两台电脑上分别设置其IPv4的配置 第一台电脑的设置步骤如下 打开网络和共享中心 点击更改设配器设置 在以太网那里右键属性 双击Internet 协议版本4 TCP
  • logstash多任务多管道pipeline配置启动,方案分析

    文章目录 6 0以下方案 6 0以下方案分析 启动方式 6 0以上方案 启动方式 6 0以下方案 logstash处理多个输入输出源方案 没有使用多管道 两个任务 jdbc demo 手写自定义mysql conf input stdin
  • keil调试GD32E23系列芯片找不到 j-link问题解决

    背景 今年因为疫情 下半年芯片疯涨 公司各个产品的芯片都比较紧缺 原来使用的芯片都为st和华大公司的芯片 价格还好 都不超过五块 现在拿货 st芯片价格已经涨了30块左右 吃不消 遂开始加紧开发国内的芯片 目录 一 问题 二 问题可能的根源
  • redis教程

    Redis和tp使用 类型 支持多种数据结构类型 包括string 字符串 hash 哈希 list 链表 set 无序集合 Zset 有序集合 Redis能读的速度是110000次 s 写的速度是81000次 s Redis所有单个命令的
  • AIX字体丢失——解决方案

    问题 图标中文显示为方框 报表工具FineReport 解决办法 拷贝中文字体到操作系统 1 将 WINDOWS Fonts 目录下SIMSUN TTC 宋体 拷贝到 AIX JDK安装目录 jre lib fonts 目录下 2 如果是j
  • Pixel手机电信4G破解(含解锁BL和root)

    Pixel电信4G破解 由于谷歌没有支持电信 因此若想使用电信的网络就需要破解 仅支持欧洲版 其它版的可以试试 本文分为两种电信破解方式 第二种不需要格式化 要想破解电信 必须root 首先需要下载电脑的驱动 下载完成后还需要安装 方法 安
  • 学习笔记借助ChatGPT自动制作PPT

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 两步实现自动制作PPT 二 步骤 1 通过ChatGPT生成文本文档 2 借助MINDSHOW生成PPT 总结 一 两步实现自动制作PPT 文本内容生成 cha
  • Git基础操作:合并某个分支的一个commit到另一个分支

    有的时候不小心在错误的分支A上开发了一点代码 也已经提交了 这个时候如果想把这部分代码移到正确的分支B上可以如下操作 使用git log命令找到错误提交的那次commitid git log commit 8b19200eed045d5be
  • QT布局

    布局管理 以下是Qt手册中的 布局管理 的译文 在一个Widget中 Qt布局管理系统提供了一个简单而有效的方式来自动组织子widget 以保证他们能够很好地利用可用空间 介绍 Qt包含一个布局管理类的集合 它们被用来描述widgets如何
  • JSON的编写规则

    JSON的规则很简单 对象是一个无序的 名称 值 对 集合 一个对象以 左括号 开始 右括号 结束 每个 名称 后跟一个 冒号 名称 值 对 之间使用 逗号 分隔 规则如下 1 映射用冒号 表示 名称 值 2 并列的数据之间用逗号 分隔 名
  • 敏感性、特异度、α、β、阳性预测值(PPV)、阴性预测值(NPV)等指标及置信区间计算(附R语言代码)

    这个虽然简单但老是被绕进去 所以整理一下方便查阅 首先画一个2 2的混淆矩阵confusion matrix TP True positive 真阳性 FP False positive 假阳性 FN False negative 假阴性
  • 微信小程序存在的风险_浅谈微信小程序会中病毒事件

    小程序其实是云端数据 不在软件里 所以小程序没有进入的端口 所以华为的管家也检测不出来 但是你按照腾讯的方法收索的话 就等于默认开通小程序 把你的数据放到云端 同时你拥有的账号就绑定了一大堆应用程序 这些程序你永远也别想删除掉 除非不用那个
  • C语言学习(四)——字符串处理函数

    字符串处理函数 17个 1 gets include