C语言字符及字符串讲解

news2024/11/27 22:43:20

文章目录

  • 前言
  • 一、字符介绍和使用
  • 二、字符串介绍和使用
  • 三、字符串操作函数
  • 四、字符串的长度和字符串所占内存空间的大小
  • 总结


前言

C 语言中的字符和字符串是常用的数据类型。字符是一个单个的字母、数字、标点符号或者其他可打印的符号,使用单引号 ’ ’ 表示,例如:‘A’、‘0’、‘+’ 等。C 语言使用 ASCII 码表示字符,每个字符都有一个整数值和一个字符表示。

字符串是字符数组或指针,表示一个或多个字符的序列。字符串使用双引号 " " 表示,例如:“hello”、“world” 等。字符串的最后一个字符是 ‘\0’,表示字符串的结尾。

一、字符介绍和使用

在计算机编程语言中,字符表示单个字符,如字母、数字或标点符号等,用于表示文本信息和各种类型的数据。在C语言中,字符使用单引号(’ ')表示。例如,单引号中的字符‘a’、‘A’、‘0’都是字符。

字符变量和字符常量是计算机程序中常用的C字符处理机制。变量通常存储一个或多个字符的系列。常量是字符的固定值,不能被修改。字符常量可以存在程序中或通过用户输入设置,然后被分配给字符变量。字符数组也是一种常见的字符处理机制,由多个字符变量组成。

以下是一些C语言中字符的示例代码:

#include <stdio.h>

int main() {
	char c = 'A';  // 定义一个字符变量
	printf("The character is %c\n", c); // 输出字符

	char ch = getchar(); // 获取从键盘输入的字符
	printf("The character entered is %c\n", ch);

	return 0;
}

运行结果:
在这里插入图片描述
以上代码演示了如何定义一个字符变量和如何使用 getchar() 函数从用户输入中获取字符。 getchar() 函数从键盘读取一个字符,用户需要输入字母或其他可显示字符,然后按下回车键。在以上示例中,用户输入的字符将存储在变量 ch 中,并打印出来。

二、字符串介绍和使用

字符串是字符序列,是C语言中非常重要的一种数据类型。字符串中的字符使用空字符(‘\0’)作为结尾。与字符不同,字符串是必须使用双引号(" ")来表示。在C语言中,我们通常用字符指针或字符数组来表示字符串。

在C语言中没有提供内置的字符串类型,但提供了一些便于处理字符串的函数(如strlen()、strcpy()等),此外我们一般使用字符数组或字符指针来模拟字符串。

下面是一个C语言中使用字符数组或字符指针来模拟字符串的示例代码:

#include <stdio.h>
#include <string.h>

int main(){
    char str1[] = {'h', 'e', 'l', 'l', 'o', '\0'}; // 声明字符数组
    char str2[] = "world"; // 另一种声明字符数组的方法
    printf("The strings are %s and %s\n", str1, str2);

    char* ptr = "hello world"; // 声明字符指针
    printf("The string is %s\n", ptr);

    char str3[20] = "hello";
    char str4[20];
    strcpy(str4, str3); // 将 str3 的内容复制到 str4
    printf("The new string is %s\n", str4);

    char str5[20] = "hello";
    char str6[20] = "world";
    strcat(str5, str6); // 将 str6 的内容附加到 str5 后面
    printf("The result string is %s\n", str5);

    char str7[20] = "hello";
    printf("The length of string is %d\n", strlen(str7)); // 获取字符串长度

    return 0;
}

以上代码演示了如何声明字符数组和字符指针来表示字符串,以及如何使用字符数组和指针来实现字符串操作,包括将两个字符串合并、复制、获取字符串长度等等。

指针在字符串中的使用十分广泛,在字符串操作中,常需要指向字符串常量或字符串数组的指针,可以通过字符指针和字符数组的相互转换来方便地完成操作。

以下是一个使用字符指针和字符数组指向字符串的示例代码:

#include <stdio.h>
#include <string.h>

int main(){
    char* ptr = "hello world"; // 声明字符指针
    char arr[] = "world";
    printf("%s\n", ptr);
    printf("%s\n", arr);

    int len1 = strlen(ptr); // 获取 ptr 指向的字符串的长度
    int len2 = strlen(arr); // 获取 arr 指向的字符串的长度
    printf("The length of string is %d\n", len1);
    printf("The length of string is %d\n", len2);

    char* p = arr; // 声明字符指针p,指针指向到字符数组arr
    printf("%c\n", *(p + 1)); // 输出字符数组第二个字符

    return 0;
}

以上代码演示了如何使用字符指针和字符数组指向字符串,包括获取字符指针所指向的字符串的长度、输出字符数组中的单个字符。

总而言之,字符串是C语言中非常重要的数据类型,C语言没有内置的字符串类型,但是提供了许多字符串处理函数(如strlen()、strcpy()、strcat()等),简化了操作。C语言中常使用字符数组或字符指针来表示字符串,并通过指针的运用来完成对字符串的操作。

三、字符串操作函数

在C语言中,许多字符串操作函数都有_s版本和普通版本的实现。_s版本在一些函数中出现是为了解决常见的缓冲区溢出漏洞,比如strcpy()和sprintf()等函数,这些函数在处理字符串时没有检查缓冲区的边界,导致可能会发生缓冲区溢出漏洞,从而造成安全漏洞。

_s版本的函数增加了一个额外参数(通常称为边界参数),用于指定目标缓冲区的长度,从而避免了缓冲区溢出的问题。例如,strcpy_s()函数的原型如下:

errno_t strcpy_s(char *dest, rsize_t destsz, const char *src);

在此原型中,dest参数是目标字符数组的首地址,destsz参数是dest数组的大小,src参数是要复制的源字符串的首地址。因此,当复制源字符串时,该函数将检查目标缓冲区是否可以容纳整个源字符串,如果destsz小于源字符串的长度,strcpy_s()将返回一个错误码,并且不会将源字符串复制到目标缓冲区中。

下面是一个演示S函数和普通函数使用的示例代码:

#include <stdio.h>
#include <string.h>

int main(){
    char dest[10];
    char* src = "Hello, World!";
    strcpy(dest, src);
    printf("%s\n", dest); // 输出 Hello, Worl

    char dest_s[10];
    char* src_s = "Hello, World!";
    strcpy_s(dest_s, 10, src_s);
    printf("%s\n", dest_s); // 输出 Hello, Wo

    return 0;
}

以上代码演示了strcpy()和strcpy_s()两个函数的使用。在第一个strcpy()中,源字符串的长度大于dest数组的大小,这将导致缓冲区溢出,并且复制的字符串被截断。在第二个strcpy_s()中,由于指定了destsz,因此在字符串复制之前,将检查dest数组的大小是否足以容纳整个源字符串。在执行复制操作之前,由于目标数组太小,strcpy_s()返回了一个错误码。

总而言之,S版本字符串操作函数在一些操作中提高了安全性,通过传递边界参数来检查缓冲区大小,从而避免缓冲区溢出和其他安全漏洞。但使用_s版本的函数需要仔细检查其特定用途,并确保正确使用参数以避免缓冲区溢出和其他安全漏洞的问题。

四、字符串的长度和字符串所占内存空间的大小

字符串是一个以null字符(‘\0’)结尾的字符数组。由于字符串以null字符结尾,因此可以通过null字符来确定字符串的长度。可以使用标准库函数strlen()来计算字符串的长度,该函数返回从字符串的起始位置开始到null字符之前的字符数。例如,下面的代码计算字符串"Hello, World!"的长度并输出:

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello, World!";
    printf("Length of the string is: %zu\n", strlen(str)); //输出长度为13
    return 0;
}

另一方面,字符串所占的内存空间的大小取决于该字符串的长度。当一个字符串被存储在内存中时,它实际上是被存储为一个char类型的数组。由于每个char类型在内存中占用1个字节的空间,因此一个包含n个字符的字符串在内存中占用的空间大小为n+1个字节,其中一个字节用于储存null字符的终止符。

例如,下面的代码演示了一个用字符串字面量创建的字符串所占用的内存空间大小:

#include <stdio.h>

int main() {
    char str[] = "Hello, World!";
    printf("Memory space used by the string: %zu bytes\n", sizeof(str)); // 输出内存占用14 bytes
    return 0;
}

由于这个字符串包含的字符数是13个,再加上一个null字符结尾,因此其占用的内存大小为14个字节。

需要注意的是,当C语言编译器处理字符串字面量时,它会自动向字符串的末尾添加一个null字符,以确保该字符串是以null字符结尾的。因此,在使用字符串字面量初始化一个字符串时,不需要显式地添加null字符。

总结

本篇文章就讲解到这里字符串在C语言中是非常重要的,需要大家细心的去学习,并且多加练习。

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

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

相关文章

Linux route命令实战:route 命令实战教程,配置静态路由,删除路由表项

前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本文是专栏【linux基本功-基础命令实战】的第61篇文章。 专栏地址&#xff1a;[linux基本功-基础命令专栏] &#xff0c; 此专栏是沐风晓月对Linux常用命令的汇总&#xff0c;希望能够加深自己的印象&am…

使用大型语言模(LLM)构建系统(四):链式提示

今天我学习了DeepLearning.AI的 Building Systems with LLM 的在线课程&#xff0c;我想和大家一起分享一下该门课程的一些主要内容。 下面是我们访问大型语言模(LLM)的主要代码&#xff1a; import openai#您的openai的api key openai.api_key YOUR-OPENAI-API-KEY def get_…

word如何转化为pdf格式?分享四个方法给大家!

在工作和学习中&#xff0c;经常需要对文档进行转换&#xff0c;其中将Word文档转换为PDF是最常见的格式转换之一。下面介绍几种常用的转换方法&#xff0c;包括使用记灵在线工具。 方法一&#xff1a;使用Word软件直接转换 如果你使用的是电脑上的Word软件&#xff0c;可以直…

vue3ts安装sass(scss)

序 1、我附上个sass的github&#xff08;跟本教程无关&#xff09;地址GitHub - sass/sass: Sass makes CSS fun! 2、博主本地环境 "vue": "^3.2.47", "typescript": "^5.0.2" "vite": "^4.3.9", node18.12.1 3、…

外贸企业必看!这五种企业邮箱最适合你的跨国业务需求

在当今的数字世界中&#xff0c;电子邮件的使用对任何外贸企业的成功都至关重要。在技术的冲击下&#xff0c;企业开展运营以及与客户、潜在客户和合作伙伴沟通的方式发生了巨大变化&#xff0c;电子邮件迅速成为外贸中首选的沟通方式。 说到哪种企业邮箱最适合外贸企业使用&am…

MATLAB使用技巧之局部放大图的制作及文本箭头的便捷设置

MATLAB使用技巧之局部放大图的制作及文本箭头的便捷设置 文章目录 MATLAB使用技巧之局部放大图的制作及文本箭头的便捷设置制作局部放大图的方法文本箭头的便捷设置小结 本文主要介绍如何在MATLAB中绘制局部放大图和如何便捷地设置文本箭头的相关内容&#xff0c;以作后续回顾之…

CISP-PTE2022最新考试经验分享

CISP_PTE2022年10月份考试心得体会 2022年9月份由于公司需要&#xff0c;参加了中启航的CISPPTE培训&#xff0c;总培训时间八天&#xff0c;8师傅讲的很好&#xff0c;浅显易懂&#xff0c;经过4天的理论学习和4天的实操练习&#xff0c;经过十一假期的熟练&#xff0c;我在10…

2005-2021年全国及31省绿色信贷水平(含原始数据和测算过程)

1、时间&#xff1a;2005-2021年 2、范围&#xff1a;全国及31省市 4、内容说明&#xff1a;包含原始数据、计算结果、计算过程 5、来源&#xff1a;工业NJ、2018年经济普查、其中2017年缺失已采用插值法补齐 6、计算说明&#xff1a; 选取各省六大高耗能产业利息支出占工…

Unity3D:Project窗口

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 Project 窗口 “项目”窗口显示与项目相关的所有文件&#xff0c;是您在应用程序中导航和查找资源和其他项目文件的主要方式。默认情况下&#xff0c;当您启动新项目时&#xff0c…

这里推荐几个前端icon网站(动图网站)

1. Loading.ioLoading.io 是一个免费的加载动效(Loading animations)图标库。它提供了多种风格的加载动效图标,包括 SVG、CSS 和 Lottie 动画格式。这些加载图标可以增强用户体验,为网站和应用程序添加更佳的视觉效果。 网站地址:loading.io - Your SVG GIF PNG Ajax Loading…

Vue 中如何处理树形结构数据渲染与操作?

Vue 中如何处理树形结构数据渲染与操作&#xff1f; 在实际开发中&#xff0c;我们经常会遇到需要渲染树形结构数据的情况&#xff0c;例如商品分类、组织架构、地区选择等等。Vue 提供了一些便捷的方法和工具来处理树形结构数据的渲染和操作&#xff0c;本文将介绍 Vue 处理树…

web前端要怎么样自学?

前言 前端入门相关的路线图以及资源都帮大噶准备好啦&#xff0c;希望对想要入门前端的小伙伴们有所帮助~ 先放上前端学习的思维导图 &#xff1a; 学习前准备&#xff1a;编译器 编译器方面的选择推荐HBuilder X或者Vscode&#xff0c;运行环境在浏览器&#xff0c;推荐是ch…

Mysql锁机制简介

一、什么是锁 锁是系数据库统区别于文件系统的一个关键特性。 锁机制用于管理对共享资源的并发访问&#xff0c;提供数据的完整性和一致性。 InnoDB存储引擎不仅会在行级别上对表数据上锁&#xff0c;还会在数据库内部其他多个地方使用锁&#xff0c;从而允许对多种不同资源…

【项目实战】一、Spring boot整合JWT、Vue案例

前言 通过Spring boot整合JWT、Vue案例&#xff0c;其中融合了微服务网关、微服务等。 1、若无公共模块&#xff0c;先添加公共模块 1.1、创建模块&#xff1a;common-service 1.2、修改父项的pom文件 1.2.1、给springCloud父项添加子模块 1.2.2、添加common-service的全局…

FinClip | 日子过的飞快,又来汇报了

FinClip 的使命是使您&#xff08;业务专家和开发人员&#xff09;能够通过小程序解决关键业务流程挑战&#xff0c;并完成数字化转型的相关操作。不妨让我们看看在本月的产品与市场发布亮点&#xff0c;看看是否有助于您实现目标。 产品方面的相关动向&#x1f447;&#x1f…

【021】C/C++字符串处理函数

C/C字符串处理函数 引言一、字符串操作函数1.1、测量字符串的长度strlen1.2、字符串拷贝函数strcpy1.3、字符串追加函数strcat1.4、字符串比较函数strcmp 二、字符串查找函数2.1、字符串查找字符函数strchr2.2、字符串查找子串函数strstr 三、其他字符串处理函数3.1、字符串分割…

结构型设计模式04-适配器模式

&#x1f9d1;‍&#x1f4bb;作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 适配器模式 1、适配器模式介绍 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计…

chatgpt赋能python:用Python实现文本数字转换:从123到一二三

用Python实现文本数字转换&#xff1a;从123到一二三 在网站开发中&#xff0c;我们经常需要将数字转换成文字&#xff0c;比如将123转成“一百二十三”。这种数字转文字的需求&#xff0c;既方便了用户的阅读&#xff0c;也提高了网站的可读性和SEO效果。 在本文中&#xff…

定时任务原理方案综述 | 京东云技术团队

本文主要介绍目前存在的定时任务处理解决方案。业务系统中存在众多的任务需要定时或定期执行&#xff0c;并且针对不同的系统架构也需要提供不同的解决方案。京东内部也提供了众多定时任务中间件来支持&#xff0c;总结当前各种定时任务原理&#xff0c;从定时任务基础原理、单…

excel中的vlookup函数使用,查找对应信息

简单做一个小表格&#xff0c;第一列序号、第二列姓名、第三列数值 显然我这里都乱序了&#xff0c;是为了更好的展示 vlookup函数是查找函数的一种&#xff0c;有四个参数&#xff1a; VLOOKUP(lookup_value,table_array,col_index_num,range_lookup) lookup_value&#xf…