C 程序设计教程(19)—— 数组和指针(二):字符数组与字符串

news2024/9/23 3:31:02

C 程序设计教程(19)—— 数组和指针(二):字符数组与字符串

在这里插入图片描述

该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用户阅读。

目录

  • C 程序设计教程(19)—— 数组和指针(二):字符数组与字符串
    • 一、字符数组的初始化
    • 二、字符串的输入与输出
    • 三、字符串处理函数
        • 1、字符串输出函数:puts
        • 2、字符串输入函数 gets
        • 3、字符串连接函数 strcat
        • 4、字符串拷贝函数 strcpy
        • 5、字符串比较函数 strcmp
        • 6、测字符串长度函数 strlen
    • 四、字符串的应用举例

一、字符数组的初始化

字符数组也可以在定义时初始化,例如:

char c[10]={'C',' ','p','r','o','g','r','a','m'};
//最后一个元素 c[9] 未赋值,系统自动赋予空字符('\0')

当对全部元素赋值时可以省略长度说明。例如:

char c[]={'C',' ','p','r','o','g','r','a','m'};
//此时,数组 c 的长度为 9。

在 C 语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。

C 语言允许用字符串的方式对数组进行初始化赋值。当把一个字符串存入一个数组时,同时把结束符 ‘\0’ 存入数组,并以此作为该字符串是否结束的标志。

用字符串的方式对数组进行初始化,格式如下:

char c[]={"C program"};
//也可以去掉花括号
char c[]="C program";

用字符串方式赋值比用字符逐个赋值要多占一个字节,用于存放字符串结束标志 ‘\0’ ,‘\0’ 是由 C 编译系统自动加上的。在用字符串对字符数组赋初值时一般无需指定数组的长度。

例如:

#include<stdio.h>
int main() 
{
	char c1[]="C program.";
	char c2[]={"Database"};
	printf("%d\n",sizeof(c1));  //数组c1有11个元素
	printf("%d\n",sizeof(c2));  //数组c1有9个元素
}

以上程序的运行结果为:

在这里插入图片描述

二、字符串的输入与输出

可以使用 printf 函数和 scanf 函数一次性输入输出一个字符数组中的字符串,而不必使用循环语句逐个输入输出每个字符。只需使用 “%s” 格式字符串即可实现。

例如:

#include<stdio.h>
int main() 
{
	char c1[]="C program.";
	char c2[20];
	scanf("%s",c2);
	printf("%s\n",c1);
	printf("%s\n",c2);
}

以上程序的运行结果如下:

在这里插入图片描述

说明:

(1)用 scanf 输入字符串时,所输入的字符串的长度必须小于所定义的字符数组的长度,以留出一个字节用于存放字符串结束标志 ‘\0’。

(2)用 scanf 输入字符串时,字符串中不能包含空格,否则将以空格作为字符串的结束符(比如上例中,字符数组 c2 只保存了一个字符 ‘I’)。

(3)使用 printf 函数输出字符串时,使用字符数组的名称,而不能带数组下标。例如:

printf("%s\n",c1);
//不能使用
printf("%s\n",c1[]);

(4)使用 scanf 输入字符串时,不能使用地址符。例如:

scanf("%s",c2);
//不能使用
scanf("%s",&c2);

三、字符串处理函数

C 语言提供了丰富的字符串处理函数。使用这些函数可以实现字符串的输入和输出、字符串的合并、修改、比较、转换、赋值、搜索等。使用输入输出函数,应在程序首部包含头文件 stdio.h,使用其他字符串函数应包含头文件 string.h。

1、字符串输出函数:puts

puts 函数的格式如下:

puts(字符串);

puts 函数完全可以由 printf 函数取代。当需要按一定格式输出时,通常使用 printf 函数。

例如:

#include<stdio.h>
int main() 
{
	char c1[]="C program.\nVisal Basic.";
	char c2[]="My name is Liming.";
	puts(c1);
	puts("\n");
	printf("%s\n",c2);
}

以上程序的运行结果如下:

在这里插入图片描述

2、字符串输入函数 gets

gets 函数的格式如下:

gets(字符数组名);

说明:通过该函数从标准输入设备上输入一个字符串。

例如:

#include<stdio.h>
int main() 
{
	char str[15];
	printf("请输入字符串:");
	gets(str);
	printf("你输入字符串为:");
	puts(str);
}

以上程序的运行结果如下:

在这里插入图片描述

说明:gets 函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是 gets 函数与 scanf 函数的不同之处。

3、字符串连接函数 strcat

strcat 函数的功能是:把字符串连接到字符数组的后面,并删除字符数组中的字符串结束标志 ‘\0’。格式如下:

strcat(字符数组名, 字符串);

例如:

#include<stdio.h>
#include<string.h> 
int main() 
{
	char str1[20]="My name is ";
	char str2[10];
	printf("请输入你的姓名:");
	gets(str2);
	printf("%s",strcat(str1,str2));
}

以上程序的运行结果如下:

在这里插入图片描述

说明:字符数组 str1 应定义足够的长度,否则不能全部装入被连接的字符串。

4、字符串拷贝函数 strcpy

strcpy 函数的功能是将字符串拷贝到字符数组中。字符串结束标志 ‘\0’ 一并拷贝。格式如下:

strcpy(字符数组名, 字符串);

例如:

#include<stdio.h>
#include<string.h> 
int main() 
{
	char str[20];
	strcpy(str,"I am a student.");
	puts(str);
}

以上程序的运行结果如下:

在这里插入图片描述

说明:只有在定义数组并进行初始化时才能使用赋值的方法把一个字符串赋值给一个字符数组。一旦初始化完毕,就只能使用 strcpy 函数实现把字符串赋值给一个字符数组。

5、字符串比较函数 strcmp

strcmp 函数的功能为:按照 ASCII 码比较两个字符串。比较规则如下:

字符串1 = 字符串2,返回值为 0;

字符串1 > 字符串2,返回值大于 0;

字符串1 < 字符串2,返回值小于 0。

strcmp 函数的格式如下:

strcmp(字符串1, 字符串2);

例如:

#include<stdio.h>
#include<string.h> 
int main() 
{
	char str1[10]="OS";
	char str2[10]="DB2";
	char str3[15]="C Language";
	char str4[10]="OS";
	printf("str1与str2比较:%d\n",strcmp(str1,str2));
	printf("str1与str3比较:%d\n",strcmp(str1,str3));
	printf("str1与str4比较:%d\n",strcmp(str1,str4));
	printf("str2与str3比较:%d\n",strcmp(str2,str3));
	printf("str2与str4比较:%d\n",strcmp(str2,str4));
	printf("str3与str4比较:%d\n",strcmp(str3,str4));
}

以上程序的运行结果如下:

在这里插入图片描述

6、测字符串长度函数 strlen

strlen 函数返回字符串的长度(不包含字符串结束符 ‘\0’),格式如下:

strlen(字符串);

例如:

#include<stdio.h>
#include<string.h> 
int main() 
{
	char str1[10]="OS";
	char str2[10]="DB2";
	printf("str1的长度:%d\n",strlen(str1));
	printf("str2的长度:%d\n",strlen(str2));
}

以上程序的运行结果如下:

在这里插入图片描述

四、字符串的应用举例

1、用户输入三个字符串,输出最大的一个字符串

程序如下:

#include<stdio.h>
#include<string.h> 
int main() 
{
	char str[3][20],string[20];
	int i,j;
	for(i=0;i<3;i++){
		printf("请输入第%d个字符串:",i+1);
		gets(str[i]);
	}
	strcpy(string, str[0]);
	for(j=1;j<3;j++){
		if (strcmp(string,str[j])<0){
			strcpy(string,str[j]);
		}
	}
	printf("最大的字符串为:%s",string);
}

以上程序的运行结果如下:

在这里插入图片描述

2、输入一行字符,统计其中有多少个单词,单词之间用空格隔开。

程序如下:

#include<stdio.h>
#include<string.h> 
int main() 
{
	char str[100];
	int i,cnt=0,word=0;
	printf("请输入一个字符串:");
	gets(str);
	for(i=0;i<strlen(str);i++){
		if (str[i]==' ') {
			word=0;			
		} else {
			if(word==0){
				word=1;
				cnt++;
			}
		}
	}
	printf("一共有%d个单词。",cnt);
}

以上程序的运行结果如下:

在这里插入图片描述

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

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

相关文章

word实用操作:几个关于录入和排版的小妙招

对于职场人来说&#xff0c;工作中使用Word早已成了习惯。而如何提高Word的技术&#xff0c;那简直是职场人一生都需要研究探索的课题。因此&#xff0c;今天小编将为大家分享几个实用的Word小技巧&#xff0c;这些技巧貌似不起眼&#xff0c;但是学会后&#xff0c;可以大大提…

如何查linux服务器的带宽占用?哪些进程占用带宽?

前言操作系统&#xff1a; Linux操作环境&#xff1a; Centos7 / ubuntulinux查看服务器带宽具体方法   一、使用speedtest-cli命令查看下载和上传最大流量值因为命令是python的&#xff0c;所以需要先下载一个python&#xff0c;用pip下载次命令&#xff1b;123yum -y insta…

七个 Vue 项目用得上的 JavaScript 库分享

文章目录前言一、vueuse二、vue-js-modal三、vue-wait四、good-table五、vue-notification六、tree select七、egjs-infinite grid总结前言 借助开源库加速 Vue 项目的开发进度是现代前端开发比较常见的方式&#xff0c;平常收集一些 JavaScript 库介绍&#xff0c;在遇到需要的…

上古神兵,先天至宝,Win11平台安装和配置NeoVim0.8.2编辑器搭建Python3开发环境(2023最新攻略)

毫无疑问&#xff0c;我们生活在编辑器的最好年代&#xff0c;Vim是仅在Vi之下的神级编辑器&#xff0c;而脱胎于Vim的NeoVim则是这个时代最好的编辑器&#xff0c;没有之一。异步支持、更好的内存管理、更快的渲染速度、更多的编辑命令&#xff0c;是大神Thiago de Arruda对开…

第九层(5):STL之stack

文章目录前情回顾stack概念stack容器需要注意的地方stack类内的构造函数stack类内的赋值操作stack类内的插入stack类内的删除stack类内的访问stack类内的大小操作下一座石碑&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一名大一的智能制造专业学生&#xff0c;…

Knowledge-based-BERT(三)

多种预训练任务解决NLP处理SMILES的多种弊端&#xff0c;代码&#xff1a;Knowledge-based-BERT&#xff0c;原文&#xff1a;Knowledge-based BERT: a method to extract molecular features like computational chemists&#xff0c;代码解析继续downstream_task。模型框架如…

HTML中的div和span标签

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>HTML中的div和span标签</title> </head> <body> <!-- 1、div和span是什么&#xff1f;有什么用…

【linux】文件操作(IO)详述

文件操作一、引入二、系统调用接口2.1 open与close2.2 write2.3 read三、文件描述符3.1 分配规则四、重定向4.1 输出重定向4.2 追加重定向4.3 输入重定向4.4 独立性五、缓冲区5.1 缓冲区刷新策略5.2 缓冲区位置5.3 现象解释六、文件系统6.1 文件系统分区6.1.1 分区图6.1.2 介绍…

实时推荐业务介绍 grpc接口对接

5.1 实时推荐业务介绍 学习目标 目标 无应用 无 5.1.1 实时推荐逻辑 逻辑流程 1、后端发送推荐请求&#xff0c;实时推荐系统拿到请求参数 grpc对接2、根据用户进行ABTest分流 ABTest实验中心&#xff0c;用于进行分流任务&#xff0c;方便测试调整不同的模型上线3、推荐中心…

k8s之部署有状态应用

写在前面 本文一起看下k8s对于有状态应用部署提供的解决方案。 1&#xff1a;有状态应用和无状态应用 如果是一个应用每次重启时依赖环境都能和第一次启动时的完全一致&#xff0c;则就可以称这类应用是无状态应用用&#xff0c;反之&#xff0c;就是有状态应用&#xff0c;如…

自动写代码的AI工具,已经支持 VsCode 插件安装使用

自动写代码的AI工具&#xff0c;已经支持 VsCode 插件安装使用&#xff0c;它的功能并不是「代码补全」&#xff0c;而是「代码生成」。 之前有个比较火的 GitHub Copilot&#xff0c;但是这是商业产品&#xff0c;并且没有开源&#xff0c;现在又被告了。 GitHub Copilot 面…

SQLSERVER 事务日志的 LSN 到底是什么?

一&#xff1a;背景 1. 讲故事 大家都知道数据库应用程序 它天生需要围绕着数据文件打转&#xff0c;诸如包含数据的 .mdf&#xff0c;事务日志的 .ldf&#xff0c;很多时候深入了解这两类文件的合成原理&#xff0c;差不多对数据库就能理解一半了&#xff0c;关于 .mdf 的合…

代码随想录--二叉树章节总结 Part II

代码随想录–二叉树章节总结 Part II 1.Leetcode222 求完全二叉树结点的个数 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达…

Python机器学习:特征变换

&#x1f315; 特征变换 特征变换主要就是针对一个特征&#xff0c;使用合适的方法&#xff0c;对数据的分布、尺度等进行变换&#xff0c;以满足建模时对数据的需求。 特征变换可分为数据的数据的无量纲化处理和数据特征变换。 &#x1f317; 数据的无量纲化处理 常用处理…

22.0:Codejock Suite Pro for ActiveX COM:Crack

从 Visual Basic 5.0 和 6.0 开始一直到当前版本的 Visual Studio 的大多数 ActiveX 容器。与 Visual Studio 无缝集成并包含我们所有 ActiveX COM 产品的评估版本。评估版不提供 OCX 文件的 Unicode 版本。 创建包含一整套高度可定制的用户界面组件的专业应用程序&#xff0c;…

Flink-FinkSQL基本操作(Table API、动态表、事件窗口、分组聚合开窗查询、联结查询)

11 Table API和SQL 11.1 快速上手 引入TableAPI的依赖 桥接器 <dependency><groupId>org.apache.flink</groupId> <artifactId>flink-table-api-java-bridge_${scala.binary.version}</artifactId><version>${flink.version}</vers…

12、常用插件

文章目录12、常用插件推荐1&#xff1a;Alibaba Java Coding Guidelines推荐2&#xff1a;jclasslib bytecode viewer推荐3&#xff1a;Translation推荐4&#xff1a;GenerateAllSetter推荐5&#xff1a;Rainbow Brackets推荐6&#xff1a;CodeGlance Pro推荐7&#xff1a;Stat…

7.bWAPP -- INSECURE DIRECT OBJECT REFERENCES

7.bWAPP – INSECURE DIRECT OBJECT REFERENCES 0x01、Insecure DOR (Change Secret) 同 XSS - Stored (Change Secret) Low 仔细观察页面, 发现隐藏一个input标签, 作用是输入用户名, 并且配合提交的修改密码, 完成修改用户密码的操作: 这里就可以利用该用户名input标签达…

如何带好一个团队?团队管理的要点有哪些?

想带好一个团队并不是这么容易&#xff0c;尤其是对于新晋升管理者来说更是难上加难。团队管理可以大大提高工作效率。那么&#xff0c;团队管理的要点是什么呢&#xff1f; 1、远景和目标 成员们先要有一个共同的目标&#xff0c;在此基础上还必须要有一个好的愿景&#xff0…

即时通讯系列---如何下手做技术方案设计

1. 引出主题 IM整体涉及的内容比较多, 做技术方案设计需要慎重, 可以先从功能列表以及核心case逐步的总结出技术方案 本文结构: 1. 查看功能列表 2. 核心case分析 3. 总结技术方案设计 2. 如何做技术方案设计 1. 查看功能列表 功能清单 一级分类 二级分类 三级分类…