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

mac2025-08-23  1

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()

最新回复(0)