11.02学习

一、获取字符串的方法

1. 使用 scanf 函数:  scanf 函数可以用来从标准输入(通常是键盘)读取格式化的输入。例如:

char str[100];

scanf("%s", str);

这会读取一个字符串直到遇到空格、制表符或换行符。

2. 使用 gets 函数:  gets 函数用来读取一行输入,直到遇到换行符。但是,这个函数是不安全的,因为它不检查目标缓冲区的大小,可能会导致缓冲区溢出。因此,这个函数已经被废弃,不推荐使用。

3. 使用 fgets 函数:  fgets 函数比 gets 更安全,因为它允许你指定缓冲区的最大长度,从而避免缓冲区溢出。例如:

char str[100];

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

这会读取最多99个字符(包括换行符)或者直到遇到换行符,并将字符串存储在 str 中。

4. 使用 gets_s 函数:  gets_s 是 gets 的一个更安全的替代品,它要求指定缓冲区的大小。但是,它不是C语言标准的一部分,只在某些编译器中可用。

5. 使用 strcpy 或 strncpy 函数: 如果你已经有了一个字符串的字符数组,你可以使用 strcpy 或 strncpy 函数来复制字符串。例如:

char src[] = "Hello, World!";

char dest[100];

strcpy(dest, src);

或者

 

strncpy(dest, src, sizeof(dest) - 1);

dest[sizeof(dest) - 1] = '\0'; // 确保字符串以空字符结尾

 strncpy 比 strcpy 更安全,因为它允许你指定最大复制的字符数,防止溢出。

6. 使用 strcat 或 strncat 函数: 如果你想要将一个字符串追加到另一个字符串的末尾,可以使用 strcat 或 strncat 。 strncat 允许你指定最大追加的字符数。

7. 使用 sprintf 或 snprintf 函数: 这些函数可以将格式化的数据写入字符串。 snprintf 是安全的版本,因为它允许你指定缓冲区的大小。

8. 使用字符串字面量: 在C语言中,字符串字面量是最常见的字符串表示形式,例如:

char *str = "Hello, World!";

9. 使用 readline 函数:  readline 是一个在Unix-like系统中可用的函数,它可以读取一行输入,并允许用户编辑输入。

 

二、字符串打印的相关知识点

1.  printf 函数:  printf 是最常用的函数之一,用于格式化输出。打印字符串时,可以使用 %s 格式化说明符。例如:

#include <stdio.h>

 

int main() {

char str[] = "Hello, World!";

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

return 0;

}

2. 字符串字面量: 直接打印字符串字面量,不需要声明变量。例如:

printf("Hello, World!\n");

3.  puts 函数:  puts 函数用于打印字符串,并在末尾自动添加换行符。例如:

char str[] = "Hello, World!";

puts(str);

4.  fprintf 函数:  fprintf 与 printf 类似,但是它允许你指定输出流,不仅限于标准输出(stdout)。例如,你可以将字符串写入文件:

FILE *file = fopen("example.txt", "w");

fprintf(file, "%s\n", str);

fclose(file);

5.  sprintf 函数:  sprintf 将格式化的数据写入字符串,而不是直接打印。这在你需要构建字符串时很有用:

char buffer[100];

sprintf(buffer, "Hello, %s!", "World");

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

6.  snprintf 函数:  snprintf 是 sprintf 的安全版本,允许你指定目标缓冲区的最大长度,以避免缓冲区溢出:

char buffer[100];

snprintf(buffer, sizeof(buffer), "Hello, %s!", "World");

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

7.  fputs 函数:  fputs 类似于 puts ,但是它允许你指定输出流。例如,你可以将字符串写入文件:

FILE *file = fopen("example.txt", "w");

fputs(str, file);

fclose(file);

8.  fwrite 函数:  fwrite 用于写入二进制数据,但也可以用来写入字符串。它需要你指定要写入的字节数:

FILE *file = fopen("example.txt", "wb");

fwrite(str, sizeof(char), strlen(str), file);

fclose(file);

9. 字符串转义序列: 在字符串中使用转义序列(如 \n 表示换行, \t 表示制表符)可以在打印时控制格式:

printf("Line 1\nLine 2\n");

10. 格式化字符串: 使用 printf 和 fprintf 时,可以对字符串进行格式化,包括数字、字符、浮点数等:

int num = 42;

printf("The answer is: %d\n", num);

11. 多语言和本地化: 在国际化的应用程序中,可能需要根据用户的地区设置打印不同的字符串。这通常涉及到使用 setlocale 函数和适当的格式化。

12. 错误处理: 在写入文件时,应该检查 fprintf 、 fputs 和 fwrite 等函数的返回值,以确保数据正确写入。

 

三、处理字符串长度需注意的事情

1.  strlen 函数:  strlen 函数是C标准库中的一个函数,用于计算字符串的长度,直到遇到第一个空字符( '\0' )为止。例如:

#include <string.h>

 

int main() {

char str[] = "Hello, World!";

size_t length = strlen(str);

printf("Length: %zu\n", length);

return 0;

}

注意: strlen 返回的是 size_t 类型的值,这是一个无符号整数类型,适合表示大小和长度。

2. 字符串长度的定义: 字符串的长度是指字符串中字符的数量,不包括结尾的空字符( '\0' )。

3. 手动计算长度: 除了使用 strlen 函数,你也可以通过循环手动计算字符串的长度,直到遇到空字符:

size_t length = 0;

while (str[length] != '\0') {

length++;

}

4. 字符串数组的长度: 如果你有一个字符串数组,每个字符串的长度可能不同,你需要对每个字符串单独使用 strlen 或手动计算。

5. 多维字符数组: 在处理多维字符数组(例如二维数组)时,通常需要额外的逻辑来确定字符串的长度和数组的结构。

6. 字符串字面量的长度: 字符串字面量的长度可以通过减去起始地址和 strlen 的结果来计算,但通常直接使用 strlen 更为方便。

7. 字符串长度限制: 在处理字符串时,总是要注意缓冲区的大小限制,以避免溢出。

8.  sizeof 运算符:  sizeof 运算符可以用来获取数组或指针的总大小(以字节为单位),但它不适用于计算字符串的实际长度,因为它会返回整个数组的大小,而不是字符串的长度:

char str[] = "Hello, World!";

printf("Size of array: %zu\n", sizeof(str)); // 包含空字符

printf("Length of string: %zu\n", strlen(str)); // 不包含空字符

9. 宽字符和多字节字符: 对于包含宽字符(如UTF-16或UTF-32)的字符串, strlen 不再适用,需要使用 wcslen (对于宽字符字符串)。

10. 字符串长度与编码: 对于使用多字节字符编码(如UTF-8)的字符串,每个字符可能由多个字节组成,因此计算长度时需要考虑字符的编码方式。

11. 安全性: 在计算字符串长度时,确保不要越界访问内存,特别是在处理用户输入或不确定长度的字符串时。

 

四、函数的定义和使用的相关知识点

1. 函数定义的基本结构: 函数定义包括返回类型、函数名、参数列表(括号内的参数)和函数体。

返回类型 函数名(参数1类型 参数1名称, 参数2类型 参数2名称, ...) {

// 函数体

}

2. 返回类型: 函数可以返回一个值,返回值的类型必须在函数定义时指定。

3. 函数原型(Function Prototype): 函数原型是函数定义的一个声明,它告诉编译器函数的返回类型和参数类型,但不包括函数体。

返回类型 函数名(参数1类型 参数1名称, 参数2类型 参数2名称, ...);

4. 参数传递: C语言中,参数是通过值传递的,这意味着函数内部对参数的修改不会影响原始变量。

5. 局部变量: 在函数内部定义的变量是局部变量,它们只在该函数内部可见。

6. 全局变量: 全局变量在函数外部定义,可以被程序中的任何函数访问和修改。

7. 静态变量: 在函数内部定义的静态变量(使用 static 关键字)在函数调用结束后仍然保持其值。

8. 递归函数: 递归函数是调用自身的函数,用于解决可以分解为相似子问题的问题。

9. 函数调用: 函数调用包括函数名和括号内传递给函数的实际参数。

10. 函数重载: C语言不支持函数重载,即不允许有两个或多个同名函数具有不同的参数列表。

11. 函数指针: 函数指针是指向函数的指针,它们可以用来存储函数的地址,并在需要时调用这些函数。

12. 可变参数列表: 使用 stdarg.h 头文件中的宏,可以定义接受可变数量参数的函数。

13. 内联函数: 使用 inline 关键字可以定义内联函数,这允许编译器在编译时将函数体直接插入到每个调用点,以减少函数调用的开销。

14. 存储类别: 函数的存储类别决定了函数的生命周期和可见性。

15. 作用域: 函数的作用域限制了函数内部定义的变量和函数的可见性。

16. 函数的返回值: 函数可以通过 return 语句返回一个值给调用者。

17. 错误处理: 函数可以通过返回特定的值或使用错误码来处理错误。

18. 函数的可见性: 使用 extern 关键字可以声明函数为外部链接,使其在其他文件中可见。

19. 编译器优化: 编译器可能会对函数进行优化,包括内联展开和代码重排。

20. 函数的声明和定义分离: 函数的声明(原型)可以放在头文件中,而定义可以放在源文件中,这有助于模块化编程。

21. 函数的文档: 良好的编程实践是为函数提供文档,说明其功能、参数、返回值和任何副作用。

 

 

 

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

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

相关文章

00-开发环境 MPLAB IDE 配置

MPLAB IDE V8.83 File 菜单简介 New (CtrlN)&#xff1a; 创建一个新文件&#xff0c;用于编写新的代码。 Add New File to Project...&#xff1a; 将新文件添加到当前项目中。 Open... (CtrlO)&#xff1a; 打开现有文件。 Close (CtrlE)&#xff1a; 关闭当前打开的文件。 …

基于BP神经网络的手写体数字图像识别

基于BP神经网络的手写体数字图像识别 摘要 在信息化飞速发展的时代&#xff0c;光学字符识别是一个重要的信息录入与信息转化的手段&#xff0c;其中手写体数字的识别有着广泛地应用&#xff0c;如&#xff1a;邮政编码、统计报表、银行票据等等&#xff0c;因其广泛地应用范围…

vite和webpack

✨create-vite 和 vue-cli的区别 create-vite 和 vue-cli 都是 Vue 项目的脚手架工具&#xff0c;但它们在架构、构建速度、配置灵活性、插件生态等方面有明显的差异。 1. 基础架构和构建工具 create-vite&#xff1a;基于 Vite&#xff0c;使用原生 ES 模块&#xff08;ESM&…

鸿蒙进阶篇-Swiper组件的使用

“在科技的浪潮中&#xff0c;鸿蒙操作系统宛如一颗璀璨的新星&#xff0c;引领着创新的方向。作为鸿蒙开天组&#xff0c;今天我们将一同踏上鸿蒙基础的探索之旅&#xff0c;为您揭开这一神奇系统的神秘面纱。” 各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今…

Ubuntu删除docker

文章目录 安装依赖1.安装操作系统&#xff1a;2.CPU支持 安装docker1.查看系统版本2.执行卸载 安装依赖 1.安装操作系统&#xff1a; 高于 Ubuntu 20.04(LTS) 版本 2.CPU支持 ARM和X86_64 安装docker 1.查看系统版本 cat /etc/*releas*uname -a2.执行卸载 检查本地dock…

【机器学习】23. 聚类-GMM: Gaussian Mixture Model

1. 定义和假设 定义&#xff1a;probabilistic clustering&#xff08;model-base&#xff09; 假设&#xff1a;数据服从正态分布 2. 算法内容 我们假设数据是由k个高斯&#xff08;正态&#xff09;分布混合生成的。每个分布有2个参数&#xff1a;μ和σ。 一个分布对应一…

【系统设计】深入理解HTTP缓存机制:从Read-Through缓存到HTTP缓存的交互流程

在现代Web开发中&#xff0c;缓存机制扮演着至关重要的角色。它不仅提升了用户体验&#xff0c;还极大地优化了资源的使用效率。在这篇博文中&#xff0c;我们将从“Read-Through”缓存的概念出发&#xff0c;深入探讨HTTP缓存的工作原理和交互流程&#xff0c;并详细描述max-a…

四款主流的3D创作和游戏开发软件的核心特点和关系

四款主流的3D创作和游戏开发软件的核心特点和关系 3D建模软件&#xff1a; Blender&#xff1a; 开源免费&#xff0c;功能全面优点&#xff1a; 完全免费持续更新优化社区活跃&#xff0c;学习资源丰富功能全面(建模、动画、渲染等) 缺点&#xff1a; 学习曲线陡峭界面操作…

Spring Cloud Ribbon:负载均衡的服务调用

Spring Cloud Ribbon&#xff1a;负载均衡的服务调用 Spring Cloud Ribbon 是Spring Cloud Netflix 子项目的核心组件之一&#xff0c;主要给服务间调用及API网关转发提供负载均衡的功能&#xff0c;本文将对其用法进行详细介绍 Ribbon简介 Ribbon 是 Netflix 公司开源的一个用…

Python中模块与包

1. 模块 在Python中&#xff0c;模块是一个包含Python代码的文件&#xff0c;可以包含函数、类和变量。模块使得代码的组织和复用变得更简单。 导入模块 使用import语句可以导入模块。常用的标准库模块包括math和random。 示例&#xff1a;使用math和random模块 import ma…

Node.js:Express 服务 路由

Node.js&#xff1a;Express 服务 & 路由 创建服务处理请求req对象 静态资源托管托管多个资源挂载路径前缀 路由模块化 Express是Node.js上的一个第三方框架&#xff0c;可以快速开发一个web框架。本质是一个包&#xff0c;可以通过npm直接下载。 创建服务 Express创建一…

TensorRT-LLM的k8s弹性伸缩部署方案

Scaling LLMs with NVIDIA Triton and NVIDIA TensorRT-LLM Using Kubernetes | NVIDIA Technical Blog 一共涉及4个k8s组件&#xff1a; 1. Deployment&#xff1a;跑起来N个pod&#xff1b;指定NVIDIA官方的triton&trt-llm的docker image&#xff0c;指定好model放在哪个…

运维监控丨16条常用的Kafka看板监控配置与告警规则

本期我们针对企业运维监控的场景&#xff0c;介绍一些监控配置和告警规则。可以根据Kafka集群和业务的具体要求&#xff0c;灵活调整和扩展这些监控配置及告警规则。在实际应用场景中&#xff0c;需要综合运用多种监控工具&#xff08;例如Prometheus、Grafana、Zabbix等&#…

《基于数据库数据的迁移学习应用》

《基于数据库数据的迁移学习应用》 一、引言二、迁移学习概述&#xff08;一&#xff09;迁移学习的定义和原理&#xff08;二&#xff09;迁移学习的分类&#xff08;三&#xff09;迁移学习的优势 三、数据库的类型与特点&#xff08;一&#xff09;关系型数据库&#xff08;…

Dockerfile制作Oracle19c镜像

Dockerfile文件 cat > Dockerfile << EOF # 使用 Oracle Linux 8 作为基础镜像 FROM oraclelinux:8# 复制 Oracle 19c 安装包 COPY oracle-database-ee-19c-1.0-1.x86_64.rpm /tmp/# 安装 Oracle 19c 数据库和依赖 RUN yum localinstall -y /tmp/oracle-database-ee-…

6.0、静态路由

路由器最主要的功能就是转发数据包。路由器转发数据包时需要查找路由表&#xff08;你可以理解为地图&#xff09;&#xff0c;管理员可以直接手动配置路由表&#xff0c;这就是静态路由。 1.什么是路由&#xff1f; 在网络世界中&#xff0c;路由是指数据包在网络中的传输路…

Java如何实现企业微信审批流程

大家好&#xff0c;我是 V 哥。最近的一个项目中&#xff0c;用到企业微信的审批流程&#xff0c;整理出来分享给大家。在企业微信中实现审批流程可以通过调用企业微信的开放API完成&#xff0c;企业微信提供了审批应用接口&#xff0c;用于创建审批模板、发起审批流程以及获取…

4. 类和对象(下)

1. 初始化列表 • 之前我们实现构造函数时&#xff0c;初始化成员变量主要使⽤函数体内赋值&#xff0c;构造函数初始化还有⼀种⽅ 式&#xff0c;就是初始化列表&#xff0c;初始化列表的使⽤⽅式是以⼀个冒号开始&#xff0c;接着是⼀个以逗号分隔的数据成 员列表&#xff0c…

AI驱动的医疗创新:信息抽取与知识图谱在临床应用中的转变

一、思通数科平台支持多种输入格式&#xff0c;如电子病历、临床数据和医学文献等&#xff0c;并能将这些信息快速转换为结构化数据&#xff0c;包括自动360度不同角度的旋转识别&#xff0c;提升数据的可操作性和可检索性。通过我们的解决方案&#xff0c;医疗机构能够有效整合…

线程的joinable属性,以及主线程出现异常时,对其等待应该进行的处理

在C多线程编程中&#xff0c;线程的 joinable 属性是一个重要的概念&#xff0c;用于判断线程是否可以调用 join() 或 detach() 方法。当线程已经调用过 join() 或 detach() 之后&#xff0c;它将不再 joinable&#xff0c;此时调用 join() 或 detach() 会导致程序崩溃。 此外…