C语言中字符、字符数组、字符串

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

C语言中字符、字符数组、字符串

字符
char op;
scanf("%c",op);
printf("%c",op);

字符通过格式控制符%c来控制初始化,字符只能用单引号''来表示

char op;
op = 'a';
printf("%c",op);

定义一个字符变量只能初始化一个字符,而这种情况无法满足大多数情况的需要,当遇到多个字符的输入输出问题时就需要用到字符数组(字符串)。

字符数组/字符串

C语言中没有专门的string字符类型,所以要想表示一系列的字符集合就要用到字符数组。

也就是说,在C语言中,字符串是用字符数组来表示的。

字符串的格式控制符是%s,字符串要用""来表示。

字符串是默认以'\0'结尾的,所以'\0'也称作字符串结束标志,或者字符串结束符。被" "包围的字符串会自动在字符串的最后加'\0',而被''赋值声明的字符串却不会在末尾自动生成'\0',需要我们自己加上。

字符串有三种初始化方式,一种是采用逐个字符赋值的初始化方式(也就是初始化数组的方式),一种是采用%s的初始化方式,最后一种是gets()函数直接初始化一个字符串。

一、逐个字符赋值法
char op[20];
int i;
for(i = 0 ; i <= 19 ; i++)
{
    scanf("%c",&op[i]);
}

单个字符的赋值还是需要加取地址符&的。

通过程序运行可以发现,逐个字符赋值的初始化方式和整型数组的初始化是相同的,好像不加'\0'也没什么问题

这时候就要思考为什么字符数组后面要加'\0'的问题了

因为在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。
字符数组中的内容,直接显示,可能会出现乱码.
因为编译器从物理内存中解释字符串时,从数组头部开始依次显示字符,编译器并不知道要到哪里结束,若把不属于字符串的内容当做字符串的内容来解释了,就会出现乱码.
因此要约定一下什么时候才算结束,这个约定就是‘\0’,使用‘\0’空字符作为结束符,代表字符串的结束,这是一种默认处理方式。
有了’\0’标志后,就不必再用字符数组的长度来判断字符串的长度了。

也就是说,字符数组最后要加'\0'是一个规定,我们每次定义字符数组并且初始化的时候都要把'\0'加上.

二、采用%s初始化方式
char op[100];
scanf("%s",op);
//字符串的scanf声明方式中,op前不用加取地址符&,并且也不用具体到哪一个位置的字符,只写数组名即可
op[100] = "xxxxxxxxx"//也可以直接赋值,编译器会自动在最后补上一个'\0'
三、采用gets()函数初始化
char op[100];//利用字符数组来表示字符串
gets(op);
puts(op);

gets()函数与puts()函数经常一起使用,可以起到直接输入或者输出字符串的功能

需要注意的是gets()函数与scanf()在输入上的区别:

scanf()遇到空格就会默认输入结束,而gets()遇到回车才会默认输入结束

例1:

#include <stdio.h>
int main()
{
    char ch1[10],ch2[10];
	scanf("%s",ch1);
    gets(ch2);

	return 0;
}

依次键入asd空格fg回车asd空格fg回车

ch1="asd\0",ch2="asd fg\0"

程序2:

#include <stdio.h>
int main()
{
	char str1[20], str2[20];
	scanf("%s",str1);
	printf("%s\n",str1); 
	scanf("%s",str2);
	printf("%s\n",str2);
	
    return 0;
}

程序的功能是读入一个字符串输出,再读入一个字符串输出。可我们会发现输入的字符串中不能出现空格,例如:

测试一输入:
Hello word(回车)
输出:
Hello
world
!

程序3:

#include <stdio.h>
int main()
{
	char str1[20], str2[20];
	gets(str1);
	printf("%s\n",str1); 
	gets(str2);
	printf("%s\n",str2);
	
    return 0;
}

测试:

Helloworld! [ 输入 ]
Helloworld! [ 输出 ]

12345 [ 输入 ]
12345 [ 输出 ]

【分析】显然与上一个程序的执行情况不同,这次程序执行了两次从键盘的读入,而且第一个 字符串 取了 Helloworld! 接受了空格符,而没有像上一个程序那样分成了两个 字符串 !

所以 如果要读入一个带空格符的字符串时因该用gets( ), 而不宜用scanf( )

C语言-字符串字符数组区别 区别: C语言中没有字符串这种数据类型,可以通过char的数组来代替 字符串一定是一个char的数组,但char的数组未必是字符串 数字0(和字符'\0'等价)结尾的char数组就是一个字符串,但如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的char数组。 注: %s是打印一个字符串,%c是打印一个字符 %s会接收字符串结束标志'\0... 阅读详情

相关推荐

手把手教你用Arduino IDE玩转ESP32-S3-wroom(附串口调试技巧)

本文详细介绍了如何在Arduino IDE环境下配置和使用ESP32-S3-WROOM模块,包括开发环境搭建、硬件连接、程序烧录及高级调试技巧。通过实战步骤和常见问题解决方案,帮助开发者快速上手这一高性能Wi-Fi/蓝牙双模模组,提升物联网开发效率。

weixin_30487201的博客 269

C语言基础

一、格式输入输出 1.printf(“输出格式控制符”,输出列表项) 输出格式控制符可以是以下四种字符 格式符:%d %f %c %s,是后面输出列表项变量的占位符 修饰符:l m n - 普通字符:原样输出 转义字符:换行 \n 制表符 \t 2.scanf(“出格式控制符”,输入项地址表列) 输入格式控制符可以是以下两种字符 格式符:*%d** %f %c %s 普通字符:输入时要照原样输入 注意:地址表列要用地址运算符&取变量的地址或用指针变量 二、运算符 算术运算符 (+ - * /

m0_46692607的博客 3247

NCCL使用指南-进阶篇

前文介绍了NCCL的常用环境变量,本文介绍了NCCL-test性能基准测试,以及一些大规模集群测试的经验数据。

father_yingying的博客 1371

字符数组的初始化和赋值

char、

u011978022的专栏 872

字符串控制符及程序(一)、

1、字符串 11字符串分类: 整型(int):-2,0,5,7 浮点型(float):-1.25,-5.9.,7.7 字符串:’a’, ‘hello’, ‘Alice’, ‘123’ 1.2字符串连接和复制: 连接:&nbsp;+&nbsp;&nbsp;(仅限于字符串+字符串) 复制:(仅限于数字数字(整点、浮点均可,这时表示乘法);字符串*数字(整形)) 例1:&gt;&gt...

huakaihualuoxa的博客 732

C语言-字符数组

字符数组小记

NNLYF_的博客 9521

【C语言】printf的输出格式控制符、格式修饰符、转义字符

*:用于指定字段宽度为动态值,例如%*d表示使用变量值作为字段宽度。%x或%X:用于输出十六进制整数,字母可以使用小写x或大写X。%.:用于指定浮点数的小数位数,例如%.2f表示保留两位小数。%0:在字段宽度中,用0填充空白位置。%-:在字段宽度中,表示左对齐输出。%u:用于输出无符号十进制整数。%d:用于输出十进制整数。%p:用于输出指针的地址。%o:用于输出八进制整数。%c:用于输出单个字符。%+:正数前面加上正号。%f:用于输出浮点数。%s:用于输出字符串

weixin_51008519的博客 2421

C语言字符串字符数组的区别

C语言字符串字符数组的区别1、基本概念2、代码分析3、总结 1、基本概念 字符串字符数组很相似,但是有本质上的区别。 (1) C语言中,字符串是双引号括起来的单个或多个字符的集合,编译器自动在结尾加上’\0’字符字符串常量存储在只读数据段,无法通过指针进行修改字符串中的某个字符。 (2)C语言中,不能定义字符串(没有string关键字,只要C++才有),但是在C语言中使用字符串,通常会用字符数组来模拟字符串,必须是’\0’结尾的字符数组,这个字符数组存储通常会分配在栈区,可以被称为字符串,且该字符串

我是你的峰哥哥啊的博客 8394

C语言 字符数组字符串 详解

C语言 字符数组字符串 详解 用来存放字符的数组称为字符数组,例如: char a[10]; //一维字符数组 char b[5][10]; //二维字符数组 char c[20]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a','m'}; // 给部分数组元素赋值 char d[]={'c', ' ', 'p', 'r', 'o', 'g', 'r'...

weixin_45691686的博客 7867

字符数组字符串的区别,C语言字符数组字符串区别详解

C 语言中并不存在字符串这个数据类型,而是使用字符数组来保存字符串。那么,字符数组就一定是字符串吗? 对于这个问题,大多教科书中的回答是“是”。其实不然,字符数组字符串是完全不相同的两个概念,千万不要混淆。分析如下所示的示例代码。 #include <stdio.h> #include <string.h> int main(void) { /*字符数组赋初值*/ char cArr[] = {'I','L','O','V','E','C'}; /*字符串

nous_x的博客 1万+

C语言关于字符串字符数组的转化问题

C语言关于字符串字符数组的转化问题 小菜鸡CS本科生一枚,第一次写博客,如果有什么写的不对或者不好的欢迎大家批评指正, 写这篇博客的原因是我今天遇到的一道题,题目很简单,leetcode中等难度,可是这道题却困扰了我整整一天,连上课都没好好听讲,无论如何也想不出个所以然。之所以我被困扰了这么久,就是因为字符数组转化字符串的小细节。下面我们进入正题: 要把字符串转化为字符数组是很简单的,有手就行,在这里就不讨论也不解释了,代码如下: int main() { char *str1="numstr";

weixin_47409943的博客 1万+

C语言 —— 字符串字符数组

字符串字符数组

weixin_45767909的博客 7979

C语言字符串字符数组的区别

1.字符串的定义: (1)单个字符:(2)一维字符串数组: 3.字符串字符数组的区别: c语言字符串由C的字符数组末尾加上'\0'变形而成。

云小逸的博客 1万+

C语言字符数组字符串

字符数组是元素的数据类型为字符类型的数组。

2301_80547771的博客 2277

c语言-字符串放入字符数组

字符串指针将字符串存入字符数组中 #include <stdio.h> int main(char argc, char *argv[]) { int i = 0; int j = 0; char *str = "0123"; char a[5] = {0}; //最好设置的数组长度比较大,大于或者等于字符串长度 while(*str != '\0') { ...

weixin_42101177的博客 3万+

C语言 字符数组字符串

(后面两个就是‘\0’,字符+‘\0’=字符串)(apple00 就是 a0 行数组,apple,分别对应 a00 ,a01 ,a02,a03 ,a04,a05,a06)连接前,两串均以 '\0' 结束,连接后,串 1的 '\0' 取消,新串最后加 ‘\0’strncpy(p,p1,n) ,复制指定长度字符串(复制一个两个三个四个)C语言中没有字符串常量,用字符数组处理字符串字符串结束表示:‘\0’格式:strcpy(字符串1,字符串2);格式:strcmp(字符串1,字符串2)字符数组1必须足够大。

2401_87994648的博客 1097

C语言字符数组字符串数组

C语言字符数组字符串数组的讲解与应用

A___Snoopy的博客 1万+

C语言字符数组字符串的使用及加结束符‘\0‘的问题

1、字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素。 char str[10]={ ‘I’,’ ‘,’a’,’m’,’ ‘,‘h’,’a’,’p’,’p’,’y’}; 即把10个字符分别赋给str[0]到str[9]10个元素 如果花括号中提供的字符个数大于数组长度,则按语法错误处理;若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为

专注自动化、性能测试、测试架构学习交流 5万+

C语言字符数组字符串

文章目录字符数组基本介绍字符串注意事项字符串的访问和遍历字符串的表示形式用字符数组存放一个字符串: 用字符数组存放一个字符串,用字符指针指向一个字符串使用字符指针变量和字符数组两种方法表示字符串的讨论字符串相关函数常用字符串函数一览字符串函数应用案例字符串(字符数组)使用注意事项和细节字符串(字符数组)课堂练习 字符数组基本介绍 用来存放字符的数组称为字符数组, 看几个案例 1)char a[10]; //一维字符数组, 长度为 10 2)char b[5][10]; //二维字符数组, 后面我们详细介绍二

weixin_45417821的博客 3869
上一篇: 6-8 使用函数求余弦函数的近似值 (15 分)
下一篇: 数据结构与算法——稀疏矩阵&内存计算&广义表
Every DAV inci
博客等级 码龄6年 1万+粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Every DAV inci

小辣鸡一枚,不求打赏啦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值