C Primer Plus(6) 中文版 第4章 字符串和格式化输入/输出 4.2 字符串简介

发布于:2023-01-18 ⋅ 阅读:(153) ⋅ 点赞:(0)

4.2 字符串简介
字符串(character string)是一个或多个字符的序列。
双引号不是字符串的一部分。双引号仅告知编译器它括起来的是字符串,正如单引号用于标识单个字符一样。
4.2.1 char类型数组和null字符
C语言没有专门存储字符串的变量类型,字符串都被存储在char类型的数组中。数组由连续的存储单元组成,字符串中的字符被存储在相邻的存储单元中,每个单元存储一个字符。
注意数组末尾位置的字符\0。这是空字符(null character),C语言用它标识字符串的结束。空字符不是数字0,它是非打印字符,其ASCII码值是(或等价于)0。C中的字符串一定以空字符结束,这意味着数组的容量必须至少比待存储字符串中的字符数多1。
什么是数组?可以把数组看作是一行连续的多个存储单元。用更正式的说话是,数组是同类型数据元素的有序序列。
char name[40];
name后面的括号表明这是一个数组,方括号中的40表明该数组中的元素数量。char表明每个元素的类型。
必须创建一个数组,把字符串中的字符逐个放入数组,还要记得在末尾加上一个\0。还好,计算机可以自己处理这些细节。
4.2.2 使用字符串
/* praise1.c -- uses an assortment of strings */
#include <stdio.h>
#define PRAISE "You are an extraordinary being."
int main(void)
{
    char name[40];
    
    printf("What's your name? ");
    scanf("%s", name);
    printf("Hello, %s. %s\n", name, PRAISE);
    
    return 0;

/* 输出:

*/

scanf()在读取输入时就已经完成了把空字符放入字符串末尾这项工作。也不需要在字符串常量PRAISE末尾添加空字符。编译器会在末尾加上空字符。
scanf()在遇到第1个空白(空格、制表符或换行符)时就不再读取输入。
一般而言,根据%s转换说明,scanf()只会读取字符串中的一个单词,而不是一整句。C语言还有其他的输入函数(如,fgets()),用于读取一般字符串。
字符串和字符
字符串常量"x"和字符常量'x'不同。区别之一在于'x'是基本类型(char),而"x"是派生类型(char 数组);区别之二是"x"实际上是由两个字符组成:'x'和空字符\0。
4.2.3 strlen()函数
sizeof运算符,它以字节为单位给出对象的大小。
strlen()函数给出字符串中的字符长度。
/* praise2.c */
// try the %u or %lu specifiers if your implementation
// does not recognize the %zd specifier
#include <stdio.h>
#include <string.h>      /* provides strlen() prototype */
#define PRAISE "You are an extraordinary being."
int main(void)
{
    char name[40];
    
    printf("What's your name? ");
    scanf("%s", name);
    printf("Hello, %s. %s\n", name, PRAISE);
    printf("Your name of %zd letters occupies %zd memory cells.\n",
           strlen(name), sizeof name);
    printf("The phrase of praise has %zd letters ",
           strlen(PRAISE));
    printf("and occupies %zd memory cells.\n", sizeof PRAISE);
    
    return 0;
}  

/* 输出:

*/

string.h头文件包含多个与字符串相关的函数原型,包括strlen()。
一般而言,C把函数库中相关的函数归为一类,并为每类函数提供一个头文件。
stdio.h头文件里面包含输入/输出函数。
string.h头文件里面包含字符串相关的函数。
两种方法处理很长的printf()语句:
第1种方法是将printf()语句分为两句(可以在参数之间断为两行,但是不要在双引号中的字符串中间断开);
第2种方法是使用两个printf()语句打印一行内容,只在第2条printf()语句中使用换行符。
strlen()得出的是字符串中的字符数(包括空格和标点符号),但不包含结尾的\0。
sizeof运算符得出的是系统分配给数组的字节大小。
%zd转换说明对于strlen()同样适用。
运算对象是类型时,sizeof必须使用圆括号,运算对象是特定量时,圆括号可有可无。尽管如此,还是建议所有情况下都使用圆括号。
  


网站公告

今日签到

点亮在社区的每一天
去签到