【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串

1字符数组初始化及传递

字符数组的定义方法与前面介绍的一维数组类似.例如,

c 复制代码
char c[10];

字符数组的初始化可以采用以下方式.

(1)对每个字符单独赋值进行初始化.例如,

c 复制代码
c[O]='I';c[1]=' ' ;c[2]='a';c[3]='m';c[4]=' ';c[5]='h';c[6]='a';c[7]='p';c[8]='p';c[9]='y';

(2)对整个数组进行初始化.例如,

c 复制代码
char c[10]='T",'a','m';'h','a','p';'p','y}

但工作中一般不用以上两种初始化方式,因为字符数组一般用来存取字符串.通常采用的初始化方式是char c10="hello".因为C语言规定字符串的结束标志为'0',而系统会对字符串常量自动加一个o',为了保证处理方法一致,一般会人为地在字符数组中添加'\0',所以字符数组存储的字符串长度必须比字符数组少1字节.例如, char c10最长存储9个字符,剩余的1个字符用来存储'\0'.

【例】字符数组初始化及传递

c 复制代码
#include <stdio.h>
vold print(char c[])
(
	int  i=0;
	while(c[i])
	{
		printf("%c" ,c[i]);
	i++;
)
	printf("\n"");
}
//字符数组存储字符串,必须存储结束符'\O'
int main()
{
	char c[5]={h,e,T,T,o;
	char d[5]="how";
	printf("%s\n",c);//会发现打印了乱码
	printf("%s\n",d);
	print(d);
	return 0;
}

为什么会打印出乱码?

hello后面没有'\0',打印字符串读取时未结束

为什么改成"hello"也不行

char c5="hello";正常是应该加上一个'\0',但是因为数组长度不够.无法填上,所以改成char c6就可以了


2.scanf 读取字符串

c 复制代码
int main()
{
	char c[10];
	char d[10l;
	scanf("%s",c);
	printf("%s\n",c);
	scanf("%s%s",c,d);
	printf("c=%s,d=%s\n",c,d);
return O;
}

scanf通过%s读取字符串,对c和d分别输入"are"和"you"(中间加一个空格) , scanf在使用%s读取字符串时,会忽略空格和回车(这一点与%d和%f类似).

输入顺序及执行结果如下.

c 复制代码
hello
hello
are you
c=are, d=you

相关推荐
Navigator_Z4 小时前
LeetCode //C - 1293. Shortest Path in a Grid with Obstacles Elimination
c语言·算法·leetcode
jeo陽5 小时前
04-循环实战:素数、最大公约数、级数求和与枚举法
c语言·开发语言·数据结构
爱读书的小胖7 小时前
LeetCode 88. 合并两个有序数组 C 解题分析
c语言·数据结构·算法
inrichtt7 小时前
第七课时:STM32时钟系统揭秘:从零理解时钟树
c语言·数据结构·stm32·单片机·嵌入式硬件
知识分享小能手8 小时前
C学习教程,从入门到精通,C语言指针 —— 详细知识点总结(10)
c语言·开发语言·学习
金融小师妹8 小时前
多因子时间序列分析:美元与美债收益率变化对黄金价格+1.6%的影响
c语言·人工智能·git·决策树·pyqt
额额额对了8 小时前
Linux 驱动开发:基于 platform 总线 + misc 设备的 DS18B20 单总线温度驱动
linux·c语言·开发语言·驱动开发·嵌入式硬件
奶盐cookie9 小时前
内存区域:栈、全局区和静态区
c语言
头像很酷9 小时前
嵌入式虚拟化-xvisor-跨越边界的读客
c语言·hypervisor·xvisor·嵌入式虚拟化
Logic10110 小时前
C语言/数据结构二维数组题解:找出行列O个数均为偶数的格子——奇偶性预处理+二次遍历
c语言·数据结构·算法·二维数组·时间复杂度·动态内存分配·奇偶性