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'。