原文链接:C语言 —— 字符串与字符数组_字符串和字符数组的区别和联系-CSDN博客
字符串与字符数组
前言
字符数组与字符串区别:
1、C语言中没有字符串这种数据类型,可以通过char的数组来替代;
2、字符串一定是一个char的数组,但char的数组未必是字符串;
3、数字0(和字符‘\0’等价)结尾的char数组就是一个字符串,但如果char数组没有以数字0结尾,那么就不是一个字符串,只是普通字符数组,所以字符串是一种特殊的char的数组。
一、字符数组
1、1什么是字符数组?
用来存放字符的数组称为字符数组。
例如:
`char a[10]; //一维字符数组
char b[5][10]; //二维字符数组`
* 1
* 2
二、字符串
2.1 什么是字符串
`char c[20]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a','m'}; // 给部分数组元素赋值
char d[]={'c', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm' }; //对全体元素赋值时可以省去长度`
* 1
* 2
字符数组实际上是一系列字符的集合,也就是字符串(String)。在C语言中,没有专门的字符串变量,没有string类型,通常就用一个字符数组来存放一个字符串。
`char str[30] = {"c.biancheng.net"};
char str[30] = "c.biancheng.net"; //这种形式更加简洁,实际开发中常用`
* 1
* 2
数组第 0 个元素为’c’,第 1 个元素为’.‘,第 2 个元素为’b’,后面的元素以此类推。
字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字符一个字符地赋值了。
`char str[7];
str = "abc123"; //错误
//正确
str[0] = 'a'; str[1] = 'b'; str[2] = 'c';
str[3] = '1'; str[4] = '2'; str[5] = '3';`
* 1
* 2
* 3
* 4
* 5
2.2 字符串的使用
代码:
`#include <stdio.h>
int main()
{
char c1[] = { 'c', ' ', 'p', 'r', 'o', 'g' }; //普通字符数组
printf("c1 = %s\n", c1); //乱码,因为没有’\0’结束符
//以‘\0’(‘\0’就是数字0)结尾的字符数组是字符串
char c2[] = { 'c', ' ', 'p', 'r', 'o', 'g', '\0'};
printf("c2 = %s\n", c2);
//字符串处理以‘\0’(数字0)作为结束符,后面的'h', 'l', 'l', 'e', 'o'不会输出
char c3[] = { 'c', ' ', 'p', 'r', 'o', 'g', '\0', 'h', 'l', 'l', 'e', 'o', '\0'};
printf("c3 = %s\n", c3);
return 0;
}`
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* 10
* 11
* 12
* 13
* 14
* 15
* 16
* 17
* 18
结果:
2.3 字符串的初始化
1、char ch[6]={'h','e','l','l','o'}
,也可以写成char ch[]={'h','e','l','l','o'}
,最后⼀个位置默认保存0即'\0'
,⽤作判定字符串结束,这个很细节,需要注意。
2、char ch[6]=""
;程序会为⾸地址为ch的字符串分配6个空间,但是内存中都是空('\0')
,同上,实际上⽤户只有5个空间,最后⼀位必须是'\0'
。
3、找到字符串的开头很容易,知道它的名字(字符数组名或者字符串名)就可以。
4、在C语言中,字符串总是以'\0'
作为结尾,所以'\0'
也被称为字符串结束标志,或者字符串结束符。
2.4 例子:将 26 个大写英文字符存入字符数组
代码:
`#include <stdio.h>
int main(){
char str[30];
char c;
int i;
for(c=65,i=0; c<=90; c++,i++){
str[i] = c;
}
printf("%s\n", str);
return 0;
}`
* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* 10
* 11
结果:
2.5字符串的输入
1、scanf():通过格式控制符%s输入字符串。除了字符串,scanf() 还能输入其他类型的数据。
2、gets():直接输入字符串,并且只能输入字符串。
scanf() 和 gets() 的区别:
scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。
gets() 认为空格也是字符串的一部分,只有遇到回车键时才认为字符串输入结束,所以,不管输入了多少个空格,只要不按下回车键,对 gets() 来说就是一个完整的字符串。换句话说,gets() 用来读取一整行字符串。
举例:
`#include <stdio.h>
int main(){
char str1[30] = {0};
char str2[30] = {0};
char str3[30] = {0};
//gets() 用法
printf("Input a string: ");
gets(str1);
//scanf() 用法
printf("Input a string: ");
scanf("%s", str2);
scanf("%s", str3);
printf("\nstr1: %s\n", str1);
printf("str2: %s\n", str2);
printf("str3: %s\n", str3);
return 0;
}`
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
* 10
* 11
* 12
* 13
* 14
* 15
* 16
* 17
* 18
结果:
2.6 字符串的输出
1、puts():输出字符串并自动换行,该函数只能输出字符串。
2、printf():通过格式控制符%s输出字符串,不能自动换行。除了字符串,printf() 还能输出其他类型的数据。
代码:
`#include <stdio.h>
int main(){
char str[] = "http://c.biancheng.net";
printf("%s\n", str); //通过字符串名字输出
printf("%s\n", "http://c.biancheng.net"); //直接输出
puts(str); //通过字符串名字输出
puts("http://c.biancheng.net"); //直接输出
return 0;
}`
* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
结果:
输出字符串时只需要给出名字,不能带后边的,例如,下面的两种写法都是错误的:
`printf("%s\n", str[]);
puts(str[10]);`
* 1
* 2