[CSDN转载]清晰区分C语言中的字符串与字符数组

原文链接: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