C_字符串的一些函数

1.字符串输入函数

scanf("%s",数组名);

gets(数组名);

区别:

scanf(“%s”,数组名);  把空格识别为输入结束

#include <stdio.h>int main()
{char a[10];printf("输入:");scanf("%s",a);//gets(a);printf("输出:%s\n",a);return 0;
}

gets(数组名);  可以识别空格字符到数组中

#include <stdio.h>int main()
{char a[10];printf("输入:");//scanf("%s",a);gets(a);printf("输出:%s\n",a);return 0;
}

2.字符串输出函数

printf(“xxxx%s”,数组名);

puts(数组名);

区别:

printf可以放描述语

puts函数自动加换行符

3.计算字符串有效长度函数

计算字符串长度可以使用标准库中的 strlen 函数。这个函数位于 <string.h> 头文件中。

#include <stdio.h>
#include <string.h>int main() 
{char str[] = "Hello, World!";size_t length = strlen(str);  // 计算字符串长度printf("Length of the string is: %zu\n", length);return 0;
}

sizeof   和  strlen 的区别?

sizeof:

属性 :是一个关键字

使用格式: int val = sizeof(变量名); 可以用于变量,数组

功能    :计算占用字节空间大小的

strlen:

属性 :是一个函数

使用格式: int val = strlen(数组名) ;只能用于数组(字符串)

功能    :计算字符串的有效长度

练习1:

char a[10] = “qwert”;

sizeof(a)    //10byte

strlen(a)    //5

练习2:

char a[] = “qwert”;

sizeof(a)    //6byte   

strlen(a)    //5

练习:自己写一个。

要求:

用户在主函数中输入一个字符串,

写一个子函数,子函数功能是接到主函数的字符串计算长度,并且返回具体长度值.

主函数调用子函数通过接收返回值来打印字符串的长度.

#include <stdio.h>int my_strlen(char *str);int main()
{char a[20];int len;printf("请输入一个字符串:\n");scanf("%s",a);len = my_strlen(a);printf("输入的字符串的长度为:%d",len);return 0;
}/*******************************************************
函数名     :my_strlen
函数功能   :计数字符串的有效长度
函数参数   :char *str
函数返回值 :int
函数描述   :
*******************************************************/
int my_strlen(char *str)
{int cont = 0;int i = 0;while(*(str+i) != '\0'){cont++;i++;}return cont;
}

4.字符串复制函数

复制字符串可以使用标准库中的 strcpy 函数。这个函数位于 <string.h> 头文件中。

#include <stdio.h>
#include <string.h>int main() {char src[] = "Hello, World!";char dest[50];  // 确保目标数组足够大strcpy(dest, src);  // 复制字符串printf("Source String: %s\n", src);printf("Destination String: %s\n", dest);return 0;
}

练习:自己写一个。

要求:

        用户输入两个字符串str1 和 str2

        要求写一个子函数将str2复制给str1

        打印复制后的str1

         char str1[] = “123456”;     

         char str2[] = “abcdef“;

        复制后:str1 : “abcdef“  

#include <stdio.h>void my_strcpy(char *dest,char *src);int main()
{char str1[50],str2[50];printf("请输入str1:");scanf("%s",str1);printf("请输入str2:");scanf("%s",str2);my_strcpy(str1,str2);printf("复制后的str1:%s",str1);return 0;
}/*******************************************************
函数名     :my_strcpy
函数功能   :复制字符串
函数参数   :char *dest char *src
函数返回值 :无
函数描述   :函数会将字符串src复制给dest
*******************************************************/
void my_strcpy(char *dest,char *src)
{int i = 0;while(*(src+i) != '\0'){*(dest+i) = *(src+i);i++;}*(dest+i) = '\0';       //这句非常重要,否则当str1和str2长度不一致时会出现bug
}

假如没有加这一句:

*(dest+i) = '\0';

当str2长, str1短,  复制后str1会出现乱码,因为结束字符被覆盖了;(有些编译器在执行时会优化,不会出现乱码)

当str1长, str2短,  复制后str1会没有完全被覆盖;

可以注释掉这一句看看会发生什么。

5.字符串拼接函数 

字符串拼接可以使用标准库中的 strcat 函数。这个函数位于 <string.h> 头文件中。

#include <stdio.h>
#include <string.h>int main() {char dest[50] = "Hello, ";  // 目标字符串,留出足够空间char src[] = "World!";// 使用 strcat 函数拼接字符串strcat(dest, src);printf("Concatenated String: %s\n", dest);return 0;
}

练习:自己写一个。

要求:

用户主函数中输入两个字符串str1和str2

写一个子函数实现将str2拼接到str1后面

str1:1234

str2:abcd

拼接后:str1:1234abcd

#include <stdio.h>void my_strcat(char *dest,char *src);int main()
{char str1[50],str2[50];printf("请输入str1:");scanf("%s",str1);printf("请输入str2:");scanf("%s",str2);my_strcat(str1,str2);printf("拼接后的str1:%s",str1);return 0;
}/*******************************************************
函数名     :my_strcat
函数功能   :拼接字符串
函数参数   :char *dest char *src
函数返回值 :无
函数描述   :函数会将字符串src拼接在dest后
*******************************************************/
void my_strcat(char *dest,char *src)
{int i = 0,j = 0;while(*(dest+i) != '\0'){i++;}while(*(src+j) != '\0'){*(dest+i) = *(src+j);i++;j++;}*(dest+i) = '\0';
}

6.字符串比较函数

字符串比较可以使用标准库中的 strcmp 函数。这个函数位于 <string.h> 头文件中。

#include <stdio.h>
#include <string.h>int main() {char str1[50], str2[50];printf("请输入第一个字符串: ");scanf("%s", str1);printf("请输入第二个字符串: ");scanf("%s", str2);int result = strcmp(str1, str2);if (result == 0) {printf("两个字符串相同。\n");} else if (result < 0) {printf("第一个字符串小于第二个字符串。\n");} else {printf("第一个字符串大于第二个字符串。\n");}return 0;
}

(库函数是从头开始逐个比较,只要出现不同的字符就立马返回结果) 

练习:自己写一个。

要求:

用户在主函数输入两个字符串,str1和str2,

在子函数中判断连个字符串是否相等,(长度要相等,对应字符一样)

相等返回0,不相等返回1;

(和库函数不太一样)

#include <stdio.h>int my_strcmp(char *str1,char *str2);int main()
{char str1[50],str2[50];int judge;printf("请输入str1:");scanf("%s",str1);printf("请输入str2:");scanf("%s",str2);judge = my_strcmp(str1,str2);if(judge == 0){printf("字符串str1和字符串str2相同。");}else if(judge == 1){printf("字符串str1和字符串str2不相同。");}return 0;
}/*******************************************************
函数名     :my_strcmp
函数功能   :比较字符串
函数参数   :char *str1 char *str2
函数返回值 :int
函数描述   :比较字符串str1和字符串str2,如果相同则返回0,不相同则返回1.(长度和内容都相同)
*******************************************************/
int my_strcmp(char *str1, char *str2)
{// 定义循环索引变量int i = 0, j = 0, k = 0;// 遍历第一个字符串,找到结束符'\0'的位置while (*(str1 + i) != '\0'){i++;  // 递增索引}// 遍历第二个字符串,找到结束符'\0'的位置while (*(str2 + j) != '\0'){j++;  // 递增索引}// 如果两个字符串的长度相同if (i == j){// 比较两个字符串的每一个字符while (*(str1 + k) != '\0'){// 如果某一位置的字符不同,返回1表示不相同if (*(str1 + k) != *(str2 + k)){return 1;  // 字符不同,返回1}k++;  // 继续比较下一个字符}return 0;  // 所有字符都相同,返回0}else  // 如果两个字符串的长度不同{return 1;  // 长度不同,返回1}
}

也可以这样写,这样比较像库函数的写法。

#include <stdio.h>int my_strcmp(char *str1, char *str2);int main()
{char str1[50], str2[50];int judge;printf("请输入str1: ");scanf("%s", str1);printf("请输入str2: ");scanf("%s", str2);judge = my_strcmp(str1, str2);if(judge == 0){printf("字符串str1和字符串str2相同。\n");}else{printf("字符串str1和字符串str2不相同。\n");}return 0;
}/*******************************************************
函数名     : my_strcmp
函数功能   : 比较字符串
函数参数   : char *str1, char *str2
函数返回值 : int
函数描述   : 比较字符串str1和字符串str2,如果相同则返回0,不相同则返回1。(长度和内容都相同)
*******************************************************/
int my_strcmp(char *str1, char *str2)
{while (*str1 != '\0' && *str2 != '\0')  // 同时遍历两个字符串{if (*str1 != *str2)  // 如果字符不相同,返回1{return 1;}str1++;str2++;}// 如果两个字符串长度不同,直接返回1if (*str1 != *str2){return 1;}// 如果完全遍历过后两个字符串都相同,返回0return 0;
}

这是库函数的写法:

int my_strcmp( char *str1, char *str2) {
    while (*str1 != '\0' && *str2 != '\0') {
        if (*str1 != *str2) {
            return *str1 - *str2;  // 返回字符差值
        }
        str1++;
        str2++;
    }
    
    // 如果字符串都已结束,则比较长度
    return *str1 - *str2;
}

一些小题目练练手

1.编写程序,将用户输入的字符串中的所有的字符a用*代替,然后输出。

分析:

通过循环结构遍历每个字符并且判断是否为子符a,

如果是字符a,用*字符替换此元素

循环的条件  用户输入的字符串不是'\0'

2.输入一串字符,把其中的大写字母变成小写字母并输出

分析:

用户输入一个字符串,

通过循环结构遍历每个字符,

判断如果某个字符是大写的就把此元素替换为对应的字符小写

循环条件是  '\0'

3.写一函数判断一字符串是否为回文,是返回1,不是返回0,

"123321"              

"12321"

"asdffdsa"  

"asdfdsa"

分析:

用第一个 与最后一个比较 ,以此类推, 如果出现不相等的就不是回文

循环结构正常结束,就是回文。


1.

#include <stdio.h>int main()
{char a[100];int i = 0;printf("请输入字符串:");scanf("%s",a);while(a[i] != '\0'){if(a[i] == 'a'){a[i] = '*';}i++;}printf("已经将所以'a'替换成了‘*’\n替换后的字符串为:%s",a);return 0;
}

2.

#include <stdio.h>int main()
{char a[100];int i = 0;printf("请输入字符串:");scanf("%s",a);while(a[i] != '\0'){if(a[i] >= 'A'&& a[i] <='Z'){a[i] += 32;}i++;}printf("已经将所以大写字母替换成对应的小写字母\n替换后的字符串为:%s",a);return 0;
}

3.

#include <stdio.h>
#include <string.h>int pal(char *str);int main()
{char a[100];int judge;printf("请输入字符串:");scanf("%s",a);judge = pal(a);if(judge == 1){printf("是回文");}else if(judge == 0){printf("不是回文");}return 0;
}int pal(char *str){int len = strlen(str);for(int i = 0 ;i < len/2;i++){if(*(str+i) != *(str+len-1-i)){return 0;}}return 1;}

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

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

相关文章

【数据事务】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

Zookeeper集群数据是如何同步的?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper集群数据是如何同步的?】面试题。希望对大家有帮助&#xff1b; Zookeeper集群数据是如何同步的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper集群中的数据同步是通过一种称为ZAB&#xff08;Zo…

MySQL需掌握到何种程度?才能胜任工作

大家好&#xff0c;我是袁庭新。星友问&#xff1a;MySQL需要学到什么程度&#xff1f;才能胜任日常的软件开发工作呢&#xff01;以下是一些建议的学习目标和程度&#xff0c;这些目标旨在帮助你在工作中高效地使用MySQL。 数据库的基本概念、MySQL的安装及配置、SQL的概念、S…

HTML 快速上手

目录 一. HTML概念 二. HTML标签 1. 标题标签 2. 段落标签 3. 换行标签 4. 图片标签 5. 超链接标签 6. 表格标签 7. 表单标签 7.1 form 标签 7.2 input 标签 (1) 文本框 (2) 单选框 (3) 密码框 (4) 复选框 (5) 普通按钮 (6) 提交按钮 8. select标签 9. 无语义…

Qt 2D绘图之三:绘制文字、路径、图像、复合模式

参考文章链接: Qt 2D绘图之三:绘制文字、路径、图像、复合模式 绘制文字 除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,也可以使用QPainter::setFont()设置文字所使用的字体,使用QPainter::fontInfo()函数可以获取字体的信息,它返回QFontInfo类对象…

java调用ai模型:使用国产通义千问完成基于知识库的问答

整体介绍&#xff1a; 基于RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术&#xff0c;可以实现一个高效的Java智能问答客服机器人。核心思路是将预先准备的问答QA文档&#xff08;例如Word格式文件&#xff09;导入系统&#xff0c;通过数据清洗、向量化处理…

Java 基于Spring AI RAG组件做AI智能问答_rag检索增强_AI智能问答

基于RAG技术构建高效Java智能问答客服机器人 基于RAG&#xff08;Retrieval-Augmented Generation&#xff09;技术&#xff0c;可以构建高效的Java智能问答客服机器人。首先&#xff0c;通过向量化处理将Word格式的问答QA文档转换为机器可理解的形式&#xff0c;并存储于Vect…

顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测(Maltab)

顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测&#xff08;Maltab&#xff09; 目录 顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测&#xff08;Maltab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实…

Redis+Caffeine 多级缓存数据一致性解决方案

RedisCaffeine 多级缓存数据一致性解决方案 背景 之前写过一篇文章RedisCaffeine 实现两级缓存实战&#xff0c;文章提到了两级缓存RedisCaffeine可以解决缓存雪等问题也可以提高接口的性能&#xff0c;但是可能会出现缓存一致性问题。如果数据频繁的变更&#xff0c;可能会导…

单片机学习笔记 12. 定时/计数器_定时

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…

6.824/6.5840(2024)环境配置wsl2+vscode

本文是经过笔者实践得出的最速の环境配置 首先&#xff0c;安装wsl2和vscode 具体步骤参见Mit6.s081环境配置踩坑之旅WSL2VScode_mit6s081-CSDN博客 接下来开始为Ubuntu(笔者使用的版本依然是20.04)配置go的相关环境 1、更新Ubuntu的软件包 sudo apt-get install build-es…

【排序用法】.NET开源 ORM 框架 SqlSugar 系列

&#x1f4a5; .NET开源 ORM 框架 SqlSugar 系列 &#x1f389;&#x1f389;&#x1f389; 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列…

「Mac畅玩鸿蒙与硬件38」UI互动应用篇15 - 猜数字增强版

本篇将带你实现一个升级版的数字猜谜游戏。相比基础版&#xff0c;新增了计分和历史记录功能&#xff0c;用户可以在每次猜测后查看自己的得分和猜测历史。此功能展示了状态管理的进阶用法以及如何保存和显示历史数据。 关键词 UI互动应用数字猜谜状态管理历史记录用户交互 一…

040集——CAD中放烟花(CAD—C#二次开发入门)

效果如下&#xff1a; 单一颜色的烟花&#xff1a; 渐变色的火花&#xff1a; namespace AcTools {public class HH{public static TransientManager tm TransientManager.CurrentTransientManager;public static Random rand new Random();public static Vector3D G new V…

【机器学习】分类任务: 二分类与多分类

二分类与多分类&#xff1a;概念与区别 二分类和多分类是分类任务的两种类型&#xff0c;区分的核心在于目标变量&#xff08;label&#xff09;的类别数&#xff1a; 二分类&#xff1a;目标变量 y 只有两个类别&#xff0c;通常记为 y∈{0,1} 或 y∈{−1,1}。 示例&#xff…

Python实现网站资源批量下载【可转成exe程序运行】

Python实现网站资源批量下载【可转成exe程序运行】 背景介绍解决方案转为exe可执行程序简单点说详细了解下 声明 背景介绍 发现 宣讲家网 的PPT很好&#xff0c;作为学习资料使用很有价值&#xff0c;所以想下载网站的PPT课件到本地&#xff0c;但是由于网站限制&#xff0c;一…

基于Matlab卡尔曼滤波的GPS/INS集成导航系统研究与实现

随着智能交通和无人驾驶技术的迅猛发展&#xff0c;精确可靠的导航系统已成为提升车辆定位精度与安全性的重要技术。全球定位系统&#xff08;GPS&#xff09;和惯性导航系统&#xff08;INS&#xff09;在导航应用中各具优势&#xff1a;GPS提供全球定位信息&#xff0c;而INS…

【计算机网络】实验6:IPV4地址的构造超网及IP数据报

实验 6&#xff1a;IPV4地址的构造超网及IP数据报 一、 实验目的 加深对IPV4地址的构造超网&#xff08;无分类编制&#xff09;的了解。 加深对IP数据包的发送和转发流程的了解。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、了解IPV4地址的构造超网…

使用ESP32通过Arduino IDE点亮1.8寸TFT显示屏

开发板选择 本次使用开发板模块丝印为ESP32-WROOM-32E 开发板库选择 Arduino IDE上型号选择为ESP32-WROOM-DA Module 显示屏选择 使用显示屏为8针SPI接口显示屏 驱动IC为ST7735S 使用库 使用三个Arduino平台库 分别是 Adafruit_GFXAdafruit_ST7735SPI 代码详解 首…

[C++设计模式] 为什么需要设计模式?

文章目录 什么是设计模式&#xff1f;为什么需要设计模式&#xff1f;GOF 设计模式再次理解面向对象软件设计固有的复杂性软件设计复杂性的根本原因如何解决复杂性&#xff1f;分解抽象 结构化 VS 面向对象(封装)结构化设计代码示例&#xff1a;面向对象设计代码示例&#xff1…