C语言中关于字符串和字符数组的相关知识点


1、字符数组与字符串的区别

(1)C语言中没有字符串这种数据类型,但可以通过char的数组来代替;

(2)字符串一定是一个char的数组,但char的数组不一定是字符串;

(3)以数字0(和字符'0'等价)结尾的char数组就是一个字符串,但如果char数组没有以数字0结尾,那么它就不是一个字符串,只是普通的字符数组。所以字符串是一种特殊的char型的数组。

下面上代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
	char arr1[5] = { 'h','e','l','l','o' }; //字符数组

	char arr2[6] = { 'h','e','l','l','o' };  //字符串

	char arr3[] = { 'h','e','l','l','o','\0' };  //字符串

	printf("%s\n", arr2);
	printf("%s", arr3);

	return 0;
}

程序执行结果:

从程序的执行结果我们可以看到arr2和arr3被打印出的结果都是:“hello"。arr2中有6个元素,但我们在定义时只给了5个,这种情况下,数组中其实还有一个隐藏的'\0',因此arr2可以看作是一个字符串。由于有结束打印的标志:'\0',所以打印时不会报错。arr3中显示的给出了'\0',也可以正常打印。

问题的关键是如果我们打印arr1,会报错吗?答案是肯定的。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
	char arr1[5] = { 'h','e','l','l','o' }; //字符数组

	char arr2[6] = { 'h','e','l','l','o' };  //字符串

	char arr3[] = { 'h','e','l','l','o','\0' };  //字符串

	printf("%s\n", arr1);
	//printf("%s\n", arr2);
	//printf("%s", arr3);

	return 0;
}

程序执行结果:


我们可以看到,结果出现了乱码。出现这种情况的原因是:我们给数组arr1分配了5个地址空间,同时又把5个字符放到了这5个地址空间里面。地址空间被占满了,也就是说没有结束标志的存储位置了,因此当我们调用printf函数打印时,"%s"找不到结束标志:'\0',就也继续打印了,直至遇见'\0'或0时停止。结果是乱码也就不难理解了。

说明:字符串结束标志为\0,数字0等同于\0,但是不等同于‘0’。

2、gets()

char *gets(char *s);

功能:从标准输入读入字符,并保存到指定的内存空间,直到出现换行符或读到文件结尾为止。

参数 :
s:字符串的首地址

gets(str)与scanf("%s",str)的区别:

(1)gets(str)允许输入的字符串含有空格;

(2)scanf("%s",str)不允许输入的字符串中含有空格。

注意:由于gets()和scanf()无法知道字符串s的大小,必须遇到换行符或读到文件结尾才结束输入,因此容易导致字符数组越界(缓冲区溢出)的情况。

3、fgets()

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
	char ch[10];
	gets(ch);
	scanf("%[^\n]", ch);   //通过正则表达式获取带空格的字符串
	scanf("%s", ch);
	fgets(ch, sizeof(ch), stdin);  //fgets可以接收空格
	printf("%s", ch);             //fgets获取的字符串少于元素个数会有\n(换行),大于等于时没有换行

	return 0;
}

4、puts()

5、fputs()

fputs()是puts()的文件操作版本,但fputs()不会自动输出一个'\n'。

6、strlen()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值