C语言之字符串处理

目录

字符串长度

显示字符串

数字字符的出现次数

大小写字符转换

 字符串数组的参数传递

非字符串的字符数组


目前我们所学习到的是围绕字符串的处理,仅仅是生成字符串、读取并显示字符串,下面我学习更加灵活处理字符串的方式。


字符串长度

我们来看下述语句声明的数组:

char str[6] = "ABC";

元素个数为6的数组保存了元素个数为3的(算上字符串末尾的null字符,则长度为4)的字符串,因此str[4] str[5]都是空的,由此可知字符串不一定正好撑满字符组。

因为字符串含有表示末尾的null字符,所以第一个字符到\0为止的前一个字符就是该字符串的长度,我们可以据此来计算字符串的长度:

#include<stdio.h>/*返回字符串str的长度*/
int str_length(const char s[])
{int len = 0;while(s[len])len++;return len;
}int main()
{char str[128];printf("请输入字符串:");scanf("%s", str);printf("字符串\"%s\"的长度为%d.\n", str, str_length(str));return 0;
}

让我们来分析程序时如何执行的:

1.main函数在调用str_length函数传入的实参str,通过前面的学习可知,实参只有给出数组名称就可以了

2.通过数组的传递,函数str_length所接受的s就是main函数中的str本身

3.在str_length函数中使用变量len,遍历数组使用计算字符串的长度。

4.while语句中表达式正是数组,通过len++是数组下标逐个增加,进而判断数组元素是否为0,即字符串结束的标志“\0”。

下面我们来演示下在遍历过程中使用while语句是如何判断的:


显示字符串

这次我们不使用printf和puts函数,而只使用putchar函数显示字符串:

#include<stdio.h>/*显示字符串s*/
void put_string(const char s[])
{int i = 0;while(s[i])putchar(s[i++]);
}int main()
{char str[128];printf("请输入字符串:");scanf("%s", str);printf("你输入了:");put_string(str);printf("。\n");return 0;
}

在本程序中对字符串中字符进行遍历时使用的while语句对null字符的查找方式一样。


数字字符的出现次数


#include<stdio.h>/*将字符串s出现的数字字符保存在数组cnt中*/
void str_dcount(const char s[], int cnt[])
{int i = 0;while(s[i]){if(s[i]>='0' && s[i]<='9')cnt[s[i] - '0']++;i++;}
}
int main()
{int dcnt[10] = {0};char str[128];int i;printf("请输入字符串:");scanf("%s", str);str_dcount(str, dcnt);puts("字符出现的次数");for(i=0;i<10;i++)printf("'%d' :%d\n", i, dcnt[i]);return 0;
}

大家可能对程序中下面的代码部分有些生疏:

if(s[i]>='0' && s[i]<='9')cnt[s[i] - '0']++;i++;

特别是关于cnt数组,中表达式的运算:任意的字符减去‘0’,都能得到所需要的下标值

大家可以看下面这个文章是关于字符的介绍:https://blog.csdn.net/W06164932/article/details/135150160?spm=1001.2014.3001.5502


大小写字符转换

我们来编写两个函数,一个字符串中所有的字符转换为大写字母,一个全部转换为小写字母

#include<stdio.h>
#include<ctype.h>/*将字符串的字符全部转化为大写*/
void str_toupper(char s[])
{int i = 0;while(s[i]){s[i] = toupper(s[i]);i++;}
}
/*将字符串的字符全部转换为小写*/
void str_tolower(char s[])
{int i = 0;while(s[i]){s[i] = tolower(s[i]);i++;}
}int main()
{char str[128];printf("请输入字符串:");scanf("%s", str);str_toupper(str);printf("大写字母:%s\n", str );str_tolower(str);printf("大写字母:%s\n", str );return 0;
}

我们分别来看下关于toupper函数与tolower函数:

toupper
头文件#include<ctype.h>
原型int toupper(int c);
说明将小写字母转换为大写字母
返回值若c是小写字母,则返回转换后的大写字母,否则之间返回c
tolower
头文件#include<ctype.h>
原型int tolower(int c);
说明将大写字母转换为小写字母
返回值若c是大写应为字母,则返回转换后的小写字母,否则之间返回c

在使用这两个函数遍历字符串过程中,当发现目标字符s[i],会为其赋这些函数的返回值。

如果这两个函数是接受的是英文字母以外的字符,则原封不动的返回这些字符


 字符串数组的参数传递

#include<stdio.h>void put_strary(const char s[][6], int n)
{int i;for(i=0;i<n;i++){printf("s[%d]=\"%s\"\n", i, s[i]);}
}
int main()
{char cs[][6] = {"max", "mike", "HELLO"};put_strary(cs, 3);return 0;
}

在二维数组的形参声明中只有,只有第一维的数组元素数可以省略。


非字符串的字符数组

看如下声明:

char str[4] = {"ABCD'}; 

算上null字符需要5个字符空间,但数组只能接受4个字符,但是像下面这样进行声明,末尾就会不会加上null字符:

char str[4] = {'A', 'B', 'B', 'D'};

这样声明的变量末尾不会加上null字符,我们把它当做4个字符的集合,也就是“普通的数组”

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

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

相关文章

(12)Linux 常见的三种进程状态

&#x1f4ad; 前言&#xff1a;本章我们专门讲解进程的状态。我们先学习具体的 Linux 系统状态&#xff0c;再去介绍 OS 学科面对的概念如何理解 —— 运行态、终止态、阻塞态以及挂起态。 进程状态&#xff08;Process Status&#xff09; 什么是进程状态&#xff1f; 进程…

【node-express】实现省县市/区三级联动接口

省县市/区三级联动接口 介绍接口步骤代码部分 介绍 源码地址&#xff1a;https://github.com/thinkasany/nestjs-course-code/tree/master/demo/address 使用 navicat 导入sql文件&#xff0c;新增表&#xff0c;然后只需要一个接口 localhost:3001/region?parentId1, 不断的…

C++day2作业

把课上strcut的练习&#xff0c;尝试着改成class #include <iostream>using namespace std; class Stu { private:int age;string sex;int hign; public:int soce;void get_information();void set_information(); }; void Stu::set_information() {static Stu s1;cout …

案例195:基于微信小程序的购物商城系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

DDR3通信协议介绍篇

一.DDR3简介 DDR核心技术点就在于&#xff1a;(1)双沿传输。(2)预取prefetch. DDR的频率&#xff1a;(1)核心频率 (2)时钟频率 (3)数据传输频率&#xff1b;核心频率就是内存的工作频率&#xff1b;DDR1内存的核心频率是和时钟频率相同的&#xff0c;到了DDR2和DDR3时才有了时…

HTML 网页设计 简约风格 注册界面

成品如下 html <!DOCTYPE html> <html><head><meta charset"utf-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Science科幻注册界面</title><link href"…

uni-app uni.scss内置全局样式变量

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

【C语言】初识C语言

本章节主要目的是基本了解C语言的基础知识&#xff0c;对C语言有一个大概的认识。 什么是C语言 在日常生活中&#xff0c;语言就是一种人与人之间沟通的工具&#xff0c;像汉语&#xff0c;英语&#xff0c;法语……等。而人与计算机之间交流沟通的工具则被称为计算机语言&am…

.Net FrameWork总结

.Net FrameWork总结 介绍.Net公共语言运行库CLI的组成.NET Framework的主要组成.NET Framework的优点CLR在运行期管理程序的执行&#xff0c;包括以下内容CLR提供的服务FCL的组成 或 服务&#xff08;这个其实就是我们编码时常用到的类库&#xff09;&#xff1a;&#xff08;下…

[Angular] 笔记 12:模板驱动表单 - ngForm

Angular For Beginners - 16. Template Driven Forms (ngForm) Angular 以其表单模块而闻名。 Angular 有两种类型的表单&#xff1a; Template 以及 Reactive&#xff1a; Template 表单的特点&#xff1a;简单&#xff0c;神奇&#xff0c;一键点击。 Reactive 表单的特点&…

echarts中给图表X轴和Y轴加单位以及给tooltip(提示框)增加单位

左边没有单位&#xff0c;右图是增加单位的效果。 1.x轴y轴设置单位 增加单位不管是x轴还是y轴都可以设置name字段&#xff0c;设置完name后效果是红色箭头效果。如果想要蓝色箭头效果可以使用x轴y轴的都有的 axisLabel 属性里面有formatter配置项&#xff0c;formatter支持字…

绝缘电阻测试仪的读数方法有哪些?

绝缘电阻测试仪主要用于测量设备的绝缘电阻&#xff0c;电力工人经常使用它来测试电力设备&#xff0c;从来没有维护过电力设备的正常运行状态。在测试电力设备时&#xff0c;往往需要读取测试结果。绝缘电阻测试仪常用的读数方法有哪些&#xff1f;我一起来盘点一下。 常用的绝…

C语言—每日选择题—Day64

前言 两天没更新了&#xff0c;作者在复习期末考试&#xff0c;更新一波&#xff0c;祝大家都能顺利通过期末考试&#xff01;&#xff01;&#xff01; 指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博…

Python 爬取 哔站视频弹幕 并实现词云图可视化

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境介绍: python 3.8 解释器 pycharm 编辑器 第三方模块: requests >>> pip install requests protobuf >>> pip install protobuf 如何安装python第三方模块: win R 输入 cmd 点击确定, 输入安装命…

C++ DAY1 作业

1.定义自己的命名空间myspace&#xff0c;并在myspace中定义一个字符串&#xff0c;并实现求字符串长度 #include <iostream>using namespace std; namespace myspace {string str;int length_fun(){getline(cin,str);int i 0;while(str[i] ! \0){i;}return i;}} using…

【我与Java的成长记】之this引用和构造方法的使用详解

系列文章目录 能看懂文字就能明白系列 C语言笔记传送门 &#x1f31f; 个人主页&#xff1a;古德猫宁- &#x1f308; 信念如阳光&#xff0c;照亮前行的每一步 文章目录 系列文章目录&#x1f308; *信念如阳光&#xff0c;照亮前行的每一步* 前言一、this的使用this引用的特…

Flink1.17实战教程(第二篇:DataStream API)

系列文章目录 Flink1.17实战教程&#xff08;第一篇&#xff1a;概念、部署、架构&#xff09; Flink1.17实战教程&#xff08;第二篇&#xff1a;DataStream API&#xff09; Flink1.17实战教程&#xff08;第三篇&#xff1a;时间和窗口&#xff09; Flink1.17实战教程&…

Bert模型from_pretrained报网络错误解决办法

问题描述&#xff1a; 服务器或者本地运行以下代码时报网络连接错误&#xff1a; from transformers import AutoTokenizermodel_checkpoint "distilbert-base-uncased" tokenizer AutoTokenizer.from_pretrained(model_checkpoint, use_fastTrue, cache_dir./cac…

使用pytorch搭建ResNeXt并基于迁移学习训练

冻结除最后全连接层以外的所有权重&#xff0c;只去单独训练它最后一层的的权重&#xff0c;这个方法&#xff0c;冻结了所有网络的权重。 for param in net.parameters():param.requires_grad False

Python可视化之Matplotlib

文章目录 Matplotlib与可视化分析简单图形的绘制pylot的高级功能添加图例与注释 Matplotlib与可视化分析 我们之前对数据的处理与分析&#xff0c;其实最终还是要利用可视化工具进行更加直观的输出 我们开业通过 pip install matplotlib命令来安装对应的模块 简单图形的绘制…