C语言字符串及其函数

news/2025/11/2 21:13:06/文章来源:https://www.cnblogs.com/eyiol/p/19185448

字符串及其函数

  c语言 没有字符串类型,所以大多用字符数组代替。

1. 字符串的输入输出

使用 scanf 和 printf 的通用输入输出。

#include <stdio.h>
#include <stdlib.h>/* run this program using the console pauser or add your own getch, system("pause") or input loop */int main(int argc, char *argv[]) {//1.字符串输入char instr1[20];scanf("%s ",instr1);printf("instr1 is:%s\n",instr1);//2.字符串输入char instr2[20];gets(instr2);printf("instr2 is:%s\n",instr2);//2.字符串输出//使用字符指针定义一个字符串char * str="nihao";printf("str[2] is:%c\n",str[2]);//如果要使用字符数组表示一个字符串,那么需要添加一个 '\0' 作为结尾 char str1[10] = {'t', 'o', 'm', '\0', '7' };printf("str1 is:%s\n",str1);char * str2="jerry";printf("str2 is:%s\n",str2);char str3[]={'j','a','c','k','\0'};printf("str3 is:%s\n",str3);char str4[10]={'l','i','l','y'};printf("str4 is:%s\n",str4);return 0;
}
//输入
nihao hello world
//输出
instr1 is:nihao
instr2 is:hello world
str[2] is:h
str1 is:tom
str2 is:jerry
str3 is:jack
str4 is:lily
 
 

注意:这里 scanf("%s ",instr1); 与 gets(instr2); 的区别是,gets输入时可以有空格,scanf不行。

1.1 gets()

#include <stdio.h>
//s:字符串首地址
char * gets(char* s);
//成功:返回读入的字符串
//失败:返回NULL
 
 

1.2 fgets()

#include <stdio.h>
//s:字符串首地址
//size:指定最大读取字符串的长度(size - 1)
//stream:文件指针,如果读键盘输入的字符串,固定写为stdin
char *fgets(char *s, int size, FILE *stream);
//成功:返回读入的字符串
//失败:返回NULL
 
 

1.3 puts()

在输出完成后自动输出一个换行

#include <stdio.h>
//s:字符串首地址
int puts(const char *s);
//成功:返回非负数
//失败:返回-1
 
 

1.4 fputs()

#include <stdio.h>
//str:字符串
//stream:文件指针,如果把字符串输出到屏幕,固定写为stdout
int fputs(const char * str, FILE * stream);
//成功:0
//失败:-1
 
 

1.5 sprintf()

#include<stdio.h>
//arg 利用 format 格式化后输出到 des 里面
int sprintf(char *des,const char *format ,[argument,...]);//案例
char name[]="name";
char value[]="lisi";
char des[100];
int len=sprintf(des,"%s:%s",name,value);
puts(des);//输出
name:lisi
 
 

1.6 sscanf()

#include<stdio.h>
//src 利用 format 格式化 获取args参数
int sscanf(const char * src,const char * format,[argument,...]);//案例
char name[10];
char value[10];
char src[]="name = lisi";
int len=sscanf(src,"%s = %s",name,value);
printf("%s %s\n",name,value);//输出
name lisi
 
 

输入输出函数案例

//案例一  puts 和 gets 使用
#include <stdio.h>
#include <string.h>
#include <errno.h>int main(int argc, char *argv[]) {char str[50];if(NULL==gets(str)){strerror(errno);}puts(str);puts("end");return 0;
}
//输入
nihao
//输出
nihao
end//案例二 fgets 和 fputs
char str[50];
fgets(str,sizeof(str),stdin);
fputs(str,stdout);
//输入
nihao
//输出
nihao//案例三 sscanf 和 sprintf
char name[10];
char value[10];
char src[]="name = lisi";
char des[50];
int slen=sscanf(src,"%s = %s",name,value);
int plen=sprintf(des,"%s : %s",name,value);
puts(des);
//输出
name : lisi
 
 

2. 字符串相关函数速览

2.1 字符串赋值

strset()

将一个串中的所有字符都设为指定字符

#include <string.h>
//将字符串str所有字符赋值为c,前提是str有字符。
char *strset(char *str, char c);//案例
char string[10] = "1234";
char symbol = 'c';
strset(string, symbol);
printf("%s\n", string);//输出
cccc
 
 

strnset()

#include <string.h>
//将字符串str前n个字符赋值为c,前提是str有字符。
char *strnset(char *str, char c, unsigned n);//案例
char string[10] = "1234";
char symbol = 'c';
strnset(string, symbol,2);
printf("%s\n", string);
//输出
cc34
 
 

strcpy()

拷贝字符串

#include <string.h>
//把src所指由NUL结束的字符串复制到des所指的数组中
char *strcpy(char *des,char *src);
//返回:dest所指数组//案例:
char str[50];
char des[50];
gets(str);
strcpy(des,str);
puts(des);
//输入
nihao
//输出
nihao
 
 

strncpy()

拷贝部分字符串

#include <string.h>
//把src 的前n个字符拷贝到des里面
char *strncpy(char *des, char *src, int n);//案例
char src[50];
char des[50];
gets(src);
gets(des);
printf("des is:%s\n",strncpy(des,src,2));//输入
hello
world
//输出
des is:herld
 
 

strdup()

将源字符串拷贝到其他位置,并返回该位置的字符指针值。

#include <string.h>
//拷贝字符串str,返回值赋值给字符指针变量
char *strdup(char *str);//案例
char str[10]="123hello";
char * des;
des=strdup(str);
str[2]='k';
puts(des);
puts(str);//输出
123hello
12khello
 
 

下面的mem系列函数不仅能作用于字符,也能作用于其他类型

memset()

#include <string.h>
//给str位置处后面n个字节赋值为ch并返回str
void *memset(void *str, int ch, size_t n);//通常用于初始化数组
int arr[10];
memset(arr,0,sizeof(arr));
printf("%d\n",arr[0]);
 
 

memcpy()

拷贝src几个元素到前面des中

#include <string.h>
//拷贝几个字符到des
void *memcpy(void * des,const void * src,size_t n);
 
 

2.3 字符串拼接

strcat()

拼接字符串

#include <string.h>
//把src拼接到des后面
char *strcat(char *des,char *src);//案例:
char str[50];
char des[50];
gets(des);
gets(str);
strcat(des,str);
puts(des);//输入
hello 
world
//输出
hello world
 
 

strncat()

拼接部分字符串

#include <string.h>
//把src的前n个字符拷贝到des后面
char *strncat(char *des,char *src,int n);//案例
char src[50];
char des[50];
gets(src);
gets(des);
printf("des is:%s\n",strncat(des,src,2));//输入
hello
world
//输出
des is:worldhe
 
 

2.4 字符串比较

strcmp()

两个字符串进行比较ASCII码大小

#include <string.h>
//str1 和 str2 比较,str1大返回1 ,小返回-1
int strcmp(char *str1, char *str2);//案例
char str[10]="123hello";
char * des="234world";
printf("res is:%d\n",strcmp(str,des));//输出
res is:-1
 
 

stricmp()

两个字符串进行比较ASCII码大小,不区分大小写,使用方式和上面一样。

strncmp()

比较前几个字符串

int strncmp(char *str1, char *str2,int maxlen);
 
 

2.5 字符串查找

strchr()

从左到右在str中查找第一个c的位置,返回这个位置字符的指针

#include <string.h>
//从左到右在str中查找c的位置,返回这个位置字符的指针
char *strchr(const char *str, int c);//案例
char str[10] = "12c34";
char symbol = 'c';
char* pos=strchr(str, symbol);
printf("%d\n", pos-str);
//输出
2
 
 

strrchr()

从右往左在str中查找第一个c的位置,返回这个位置字符的指针,用法同上。

strcspn()

  该函数名是 string complementary span 的缩写,函数作用是将str2里面的字符串中所有的字符去str1中查找,然后统计这些查找到的位置,返回位置最靠前的位置。至少能找到 '/0' 字符串结尾字符,此时输出的是 str1 的字符串长度。

#include <string.h>
//返回字符串str1中第一个在指定字符串str2中出现的字符下标
int strcspn(char *str1, char *str2);//案例
char * src1="123hello";
char * src2="45nihlo";
printf("pos is:%d\n",strcspn(src1,src2));
//输出
pos is:3
 
 

strspn()

#include <string.h>
//返回字符串str1中第一个不在指定字符串str2中出现的字符下标
int strspn(char *str1, char *str2);//案例
char * src1="123hello";
char * src2="123nihao";
printf("pos is:%d\n",strspn(src1,src2));//输出
pos is:4
 
 

strpbrk()

这个作用类似strcspn()区别是strpbrk这个返回的是位置指针,strcspn返回的是位置坐标。

#include <string.h>
char *strpbrk(char *str1, char *str2);//案例
char *str1 = "123hello";
char *str2 = "nihao";
printf("pos is:%d\n",strpbrk(str1, str2)-str1);//输出
pos is:3
 
 

strstr()

查找子串

#include <string.h>
//查找str2在str1中的位置,如果没有返回
char *strstr(char *str1, char *str2);//案例
char *str1 = "123hello";
char *str2 = "ell";
printf("pos is:%d\n",strstr(str1, str2)-str1);//输出
pos is:4
 
 

strtok()

可以理解成string token,返回str中被token分隔的串

#include <string.h>
//查找str1中被str2符号分隔的单词,注意下面的str2可以是一个字符或者一个字符串
char *strtok(char *str1, char *str2);//案例
char input[16] = "abc,d,e,f";
char *p;
//查找分隔符的第一个单词 
p = strtok(input, ",");
if (p) printf("str is: %s\n", p);
//第二次使用NULL作为第一个参数,可以输出后续的分隔单词 
while(p = strtok(NULL, ",")){printf("next seq word is %s\n", p);
}
//输出
str is: abc
next seq word is d
next seq word is e
next seq word is f
 
 

2.6 其他

strlen()

查看 str 的长度

char str[50];
gets(str);
strlen(str);
puts(str);//输入
nihao
//输出
strlen is:5
 
 

strerror()

#include <string.h>
//返回错误字符串的指针
char *strerror(int errnum);//案例
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{FILE *fp = NULL;fp = fopen("./test.txt", "r");if (NULL == fp) {fprintf(stderr, "error info: %s\n", strerror(errno));exit(-1);}return 0;
}//输出
error info: No such file or directory

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/953808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CPULOAD建模设计

背景: 1.中断周期的建模 在单片机中中断和任务是两类处理数据的主要形式,中断的形式主要分为周期和时间两类。比如,LIN中断是根据调度表的周期去响应的,滚轮这种则是根据外部事件响应的。 2.响应时间的建模 中断的…

C 文件操作全解速览

文件操作文件分为二进制文件和文本文件,文本文件里面保存的内容形式是ASCII字符,二进制文件里面内容保存形式是01表示的。文件的主要作用是用来进行数据的持久化,能去长久的保存数据。这里f开头的文件操作命令,大多…

Java记录类:简化数据载体的新选择

Java 14引入的record类型为开发者提供了一种声明数据载体的简洁方式,有效减少了样板代码的编写。记录类旨在透明地保存不可变数据,自动实现数据访问方法和对象常用方法。 基本语法非常简单: public record User(Str…

第二次算法作业

基本思路 该算法采用分治策略来寻找数组中第k小的元素。首先从数组中随机选择一个基准元素,然后将数组划分为三个部分:小于基准的元素、等于基准的元素和大于基准的元素。根据k值所在的范围,决定在哪个子数组中继续…

NOIP 2025 游记 退役记

【洛谷专栏】 前言 前作:NOIP 2024 游记。 上一篇文章:CSP-S 2025 游记(The Last CSP ver.)。 同样地支持友链互挂,请私信。 CSP 结束了,可能没有冬令营机会了。 联赛,翻盘,还是,很难。 正文 2025.11 11.1 提…

一个万古常青的、小而美的输入法

一个万古常青的、小而美的输入法万古常青apt install fcitx-sunpinyin 即可安装。Ubuntu和Debian不倒,就一直有。美系统词库为libgooglepinyin和sunpinyin的合并去重版,词比它们都多。 用sunpinyin训练了字的三元语法…

开始学深度学习!

开始学深度学习!

LLaMA-Factory

LLaMA-Factory Used by Amazon, NVIDIA, Aliyun, etc.Supporters ❤️Warp, the agentic terminal for developersAvailable for MacOS, Linux, & WindowsEasily fine-tune 100+ large language models with zero-…

守护线程--daemon

线程可以分为用户线程与守护线程,虚拟机必须等待用户线程执行完毕但不用等待守护线程执行完毕 守护线程如:垃圾回收机制, 内存监控等 守护线程顾名思义,用于守护用户线程,下面举例介绍 public class Daemon {publ…

换一个思维解决问题:希望在转角

前段时间困扰我的一个网络拦截请求的问题,终于被巧妙地解决了。 我之前开发了一个net proxy,专门用于对特殊网络环境的模拟,以此测试一个工作中需要测试的软件。简单来说就是用mitmproxy实现一个网络流量代理服务,…

条件表达式中的赋值问题

条件表达式中的赋值问题在条件表达式中(如while、if语句的条件部分),不允许直接进行变量初始化并同时使用该变量进行比较。C++语法规则禁止在条件判断中同时进行变量声明和比较操作。 int numJewelsInStones(string…

csp2025 总结

T1T2 没有什么失误,大概 40min 的时候过了。 T3 之前做过 https://uoj.ac/problem/772 (但其实纯粹是误导),当时就忘记了复杂度分析依赖贡献一起处理(虚树)后来改了,场上就把虚树这个环节忘了,大样例很水所以过…

CSP 总结

J 前两题写得比较快,20min 左右过了。 T3 一开始看错了,以为区间可以重叠,手动模拟了一下样例发现不对,重读了一遍题,大概在 40min 时过了大样例。 感觉手感火热,遂开 T4,发现直接统计和大于 \(l_i\) 的不太好做…

2025 CSP

考虑自己的考场策略是否正确T1T2只用了40分种,问题在于T3的时间分配过多,但是我认为这是比较正确的因为在T1T2是签到题的情况下,以及T4基本不可能想出正解的情况下,去想一个自己已经有50分暴力分思路的T3是一个比较…

Jenkins-CICD项目自动化部署

1.环境准备主机名 IP 配置dev 192.168.233.146 2G C1project_master 192.168.233.154 3G,2C1project_slave 192.168.233.155 3G,2C1auto_deployment 192.168.233.156 5G,2C12.初始化环境 四台都做 #1.修改主机名 hostn…

使用Stream API重构你的数据处理

如果你还在使用繁琐的for循环和临时集合来处理数据,是时候了解Java 8引入的Stream API了。它让数据处理变得声明式、可组合,并且更加优雅。 什么是Stream? Stream不是数据结构,而是对数据源(集合、数组等)的元素…

js实现页面弹框,每天没个浏览器只在第一次访问会有弹框

js实现页面弹框,每天没个浏览器只在第一次访问会有弹框localStorage.getItem方法<script type="text/javascript">function GetDateStr(AddDayCount) {var dd = new Date();dd.setDate(dd.getDate()+…

[省选联考]追忆——题目背景美化

\[\textrm{\textit{\textbf{\large \textcolor{#8b5cf6}{我常常}\textcolor{#6366f1}{追忆}\textcolor{#0ea5e9}{过去。}}}} \]\[\textstyle \mathcal {\small {^{\frac{\textrm{\textit{\textbf{\textcolor{#f472b6}{…

多线程封装

//Thread.hpp #pragma once #include<iostream> #include<string> #include<cstring> #include<functional> #include<unistd.h> #include<cassert> #include<pthread.h> c…

使用 GeckoCircuits 设计 Buck 电源环路

使用 GeckoCircuits 设计 Buck 电源环路使用 GeckoCircuits 设计 Buck 电源环路 笔者最近发现一款开源的电力电子仿真软件 GeckoCircuits,它是由苏黎世联邦理工学院(ETH)开发的,具有极高的仿真速度,软件小巧,功能…