C 语言的字符串

概述

字符串 (character string) 是一个或多个字符的序列.

字符串用双引号包围. 字符用单引号包围.

'A' 是一个字符 A
"A" 是一个字符串, 包括一个字符 A 和字符串结束标志符 '\0'.
'A' 是基本类型: char
"A" 是派生类型: char 数组

C语言中没有专门储存字符串的数据类型, 字符串都被储存在字符数组中, 即 char 类型的数组.

数组在内存中占用连续的空间, 即数组由连续的存储单元组成, 因此, 字符串中的字符被储存在连续的存储单元中, 每个单元储存一个字符.

C 语言自动添加结束符的情况

  1. "abc" 是一个字符串常量, 也叫做字符串字面值, C 语言会为其自动储存一个结束符, 所以实际上是四个字符.

  2. scanf 函数在用 %s 转换说明读取字符串时, 会自动在字符数组末尾加上结束符, 因此读入的字符串的字符个数必须至少比准备用来储存这个字符串的字符数组的元素个数少一个.

字符串结束标志

字符串以 '\0' 为结束标志. 这意味着字符数组的容量至少要比它要储存的字符串的字符个数大一, 以储存结束符.

'\0' 称为空字符 (null character).

'\0' 不是数字 0, 它是一个非打印字符, 其 ASCII 码值等于 0.

代码示例:

#include <stdio.h>

int main(void)
{
	char arr1[] = "abc";
	char arr2[] = { 'a','b','c' };  // 是字符数组但不是字符串
	char arr3[] = { 'a','b','c',0 };
	char arr4[] = { 'a','b','c','\0'};
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	printf("%s\n", arr3);
	printf("%s\n", arr4);

	return 0;
}

结果:

abc
abc烫烫烫烫烫烫烫烫烫烫烫烫烫烫蘟bc
abc
abc

调试时的情况:

字符数组不一定是字符串, 只有当字符数组中各个字符的最后一个字符是结束符时, 字符数组才是字符串.

长字符串的两种换行方式

// 两种字符串换行的方式
#include <stdio.h>
#include <string.h>

int main(void) {
	char too_long[] = "hello \
world";
	char too_long2[] = "hello "
		"world";
	printf("%s\n", too_long);
	printf("%s\n", too_long2);

	return 0;
}

结果:

hello world
hello world

第一种方式,用 \ 和 Enter 键组合来断行,这要求下一行代码必须从最左边开始,如果缩进,比如缩进 5 个空格,那么这 5 个空格就会成为字符串的一部分。

程序示例:

#include<stdio.h>

int main(void) {
	char str1[] = "hello \
world";
	char str2[] = "hello \
	world";
	puts(str1);
	puts(str2);
	return 0;
}

执行结果:

hello world
hello   world

第二种方法,其实是利用了字符串的拼接,在两个用双引号括起来的字符串之间用空白隔开,C 编译器会把多个字符串看成是一个字符串。

程序示例:

#include<stdio.h>

int main(void) {
	char str1[] = "hello"  "world"; // 用空格分隔两个字符串
	char str2[] = "hello"
		"world";  //  用换行符和空格分隔字符串
	puts(str1);
	puts(str2);
	return 0;
}

执行结果:

helloworld
helloworld
posted @ 2024-04-28 10:31  有空  阅读(34)  评论(0)    收藏  举报