一、字符串和字符串I/O
在字符串和格式化输入/输出一节中我们讲过,字符串是以空字符 “ \0 ”结尾的char类型的数组。由于字符串十分常用,所以C提供了许多专门处理字符串的函数。下面详细讲述字符串的性值、如何声明并初始化字符串、在程序中输入和输出字符串以及如何操控字符串。
#include <stdio.h>
#define MSG "I LOVE C"
#define LARGE 40
int main(void){
// 定义一个字符数组
char words[LARGE] = "I am studying C";
// 定义一个不能改变的字符串指针
const char *Str1 = "that`s funny";
// 打印以下信息
puts("Some string display Here: ");
puts(MSG);
puts(words);
puts(Str1);
// 将words中的第8个元素改为P
words[8] = 'P';
puts(words);
return 0;
}
和printf()函数一样,puts函数也属于stdio.h系列的输入/输出函数。但是,和printf()不同的是,puts()函数只显示字符串(不能打印数字),而且自动在显示的字符串末尾加上换行符。
1.1 定义字符串
在上面的程序中,有三种定义字符串的方式。分别是:
- 字符串字面量(字符串常量)
#define MSG "I LOVE C"
puts(MSG);
- 字符串数组
#define LARGE 40
// 定义一个字符数组
char words[LARGE] = "I am studying C";
// 输出字符串
puts(words);
- 字符串指针
// 定义一个不能改变的字符串指针
const char *Str1 = "that`s funny";
puts(Str1);
1.1.1 字符串字面量(字符串常量)
用双引号括起来的内容称为字符串字面量(string literal),也叫做字符串常量。双引号中的字符和编译器自动加入末尾的 “ \0 ”字符,都作为字符串储存在内存中。
如果字符串字面量之间没有间隔或者用空白字符间隔,C会将其视为串联起来的字符串字面量
#include <stdio.h>
int main(void){
char msg[50] = "Hello""World" "LOVE C";
puts(msg); // 输出结果:HelloWorldLOVE C
return 0;
}
等价于:
#include <stdio.h>
int main(void){
char msg[50] = "HelloWorldLOVE C";
puts(msg); // 输出结果:HelloWorldLOVE C
return 0;
}
如果要在字符串中打印出双引号则需要加上转义符 “ \ ”。
#include <stdio.h>
int main(void){
char msg[50] = "Hello \"World\" LOVE C";
puts(msg); // 输出结果:Hello "World" LOVE C
return 0;
}
字符串常量属于静态存储类别,说明如果在函数中使用字符串常量,该字符串只会被存储一次,在整个程序的生命周期内存在,即时函数被调用多次。
1.1.2 字符串数组和初始化
定义字符串数组时,必须让编译器知道需要多少空间。一种方法是用足够空间的数组存储字符串。如下:
const char str[20] = "I LOVE C";
const表示不会更改这个字符串。
上述初始化比标准数组初始化(下述程序)简单的多:
const char str[20] = {
'I', ' ', 'L', 'O', 'V', 'E', ' ', 'C', '\0'}