C语言中字符、字符数组、字符串

C语言中字符、字符数组、字符串

字符
char op;
scanf("%c",op);
printf("%c",op);

字符通过格式控制符%c来控制初始化,字符只能用单引号''来表示

char op;
op = 'a';
printf("%c",op);

定义一个字符变量只能初始化一个字符,而这种情况无法满足大多数情况的需要,当遇到多个字符的输入输出问题时就需要用到字符数组(字符串)。

字符数组/字符串

C语言中没有专门的string字符类型,所以要想表示一系列的字符集合就要用到字符数组。

也就是说,在C语言中,字符串是用字符数组来表示的。

字符串的格式控制符是%s,字符串要用""来表示。

字符串是默认以'\0'结尾的,所以'\0'也称作字符串结束标志,或者字符串结束符。被" "包围的字符串会自动在字符串的最后加'\0',而被''赋值声明的字符串却不会在末尾自动生成'\0',需要我们自己加上。

字符串有三种初始化方式,一种是采用逐个字符赋值的初始化方式(也就是初始化数组的方式),一种是采用%s的初始化方式,最后一种是gets()函数直接初始化一个字符串。

一、逐个字符赋值法
char op[20];
int i;
for(i = 0 ; i <= 19 ; i++)
{
    
    
    scanf("%c",&op[i]);
}

单个字符的赋值还是需要加取地址符&的。

通过程序运行可以发现,逐个字符赋值的初始化方式和整型数组的初始化是相同的,好像不加'\0'也没什么问题

这时候就要思考为什么字符数组后面要加'\0'的问题了

因为在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。
字符数组中的内容,直接显示,可能会出现乱码.
因为编译器从物理内存中解释字符串时,从数组头部开始依次显示字符,编译器并不知道要到哪里结束,若把不属于字符串的内容当做字符串的内容来解释了,就会出现乱码.
因此要约定一下什么时候才算结束,这个约定就是‘\0’,使用‘\0’空字符作为结束符,代表字符串的结束,这是一种默认处理方式。
有了’\0’标志后,就不必再用字符数组的长度来判断字符串的长度了。

也就是说,字符数组最后要加'\0'是一个规定,我们每次定义字符数组并且初始化的时候都要把'\0'加上.

二、采用%s初始化方式
char op[100];
scanf("%s",op);
//字符串的scanf声明方式中,op前不用加取地址符&,并且也不用具体到哪一个位置的字符,只写数组名即可
op[100] = "xxxxxxxxx"//也可以直接赋值,编译器会自动在最后补上一个'\0'
三、采用gets()函数初始化
char op[100];//利用字符数组来表示字符串
gets(op);
puts(op);

gets()函数与puts()函数经常一起使用,可以起到直接输入或者输出字符串的功能

需要注意的是gets()函数与scanf()在输入上的区别:

scanf()遇到空格就会默认输入结束,而gets()遇到回车才会默认输入结束

例1:

#include <stdio.h>
int main()
{
    
    
    char ch1[10],ch2[10];
	scanf("%s",ch1);
    gets(ch2);

	return 0;
}

依次键入asd空格fg回车asd空格fg回车

ch1="asd\0",ch2="asd fg\0"

程序2:

#include <stdio.h>
int main()
{
    
    
	char str1[20], str2[20];
	scanf("%s",str1);
	printf("%s\n",str1); 
	scanf("%s",str2);
	printf("%s\n",str2);
	
    return 0;
}

程序的功能是读入一个字符串输出,再读入一个字符串输出。可我们会发现输入的字符串中不能出现空格,例如:

测试一输入:
Hello word(回车)
输出:
Hello
world
!

程序3:

#include <stdio.h>
int main()
{
    
    
	char str1[20], str2[20];
	gets(str1);
	printf("%s\n",str1); 
	gets(str2);
	printf("%s\n",str2);
	
    return 0;
}

测试:

Helloworld! [ 输入 ]
Helloworld! [ 输出 ]

12345 [ 输入 ]
12345 [ 输出 ]

【分析】显然与上一个程序的执行情况不同,这次程序执行了两次从键盘的读入,而且第一个 字符串 取了 Helloworld! 接受了空格符,而没有像上一个程序那样分成了两个 字符串 !

所以 如果要读入一个带空格符的字符串时因该用gets( ), 而不宜用scanf( )

猜你喜欢

转载自blog.csdn.net/ahahayaa/article/details/121586016