字符串的格式化输入/输出

本文参考C Primer Plus第四章学习

文章目录

  • 前导程序
  • 字符串简介
    • char类型数组和null字符
    • 使用字符串

1.前导程序 

程序清单1:

#include 
#include	//提供strlen函数的原型
#define	DENSITY 62.4	//人体密度	
int main()
{
    float weight,volume;
	int size,letters;
	char name[40];	//name是一个可容纳40字符的数组

    printf("%Hi,what's your first name?\n");
	scanf("%s",name);
    printf("%s,what's your weight in pounds?\n", name);
	scanf("%s",&weight);
	size=sizeof name;
	letters=strlen(name);
	volume=weight/DENSITY;
    printf("Well,%s,your volume is %2.2f cubic feet.\n", name,volume);
    printf("Also,your first name has %d letters,\n", letters);
    printf("and we have %d bytes to  store it.\n", size);

    return 0;

}

运行结果: 

字符串的格式化输入/输出_第1张图片

该程序包含以下特性: 

        用数组(array)储存字符串(character string)。在该程序中,用户输入的名被储存在数组中,该数组占用内存中40个连续的字节,每个字节储存一个字符值。
        使用%s转换说明来处理字符串的输入和输出。注意,在scanf()中,name 没有&前缀,而weight有(稍后解释,&weight 和 name 都是地址)。
        用C预处理器把字符常量DENSITY定义为62.4。
        用C函数strlen()获取字符串的长度。
        对于BASIC 的输入/输出而言,C的输入/输出看上去有些复杂。不过,复杂换来的是程序的高效和方便控制输入/输出。而且,一旦熟悉用法后,会发现它很简单。

2.字符串简介

        字符串(character string)是一个或多个字符的序列,如下所示:
        "Zing went the strings of my heart!"
        双引号不是字符串的一部分。双引号仅告知编译器它括起来的是字符串,正如单引号用于标识单个字符一样。

1.char 类型数组和null字符

        C 语言没有专门用于储存字符串的变量类型,字符串都被储存在char 类型的数组中。数组由连续的存储单元组成,字符串中的字符被储存在相邻的存储单元中,每个单元储存一个字符

字符串的格式化输入/输出_第2张图片

        数组末尾位置的字符\0。这是空字符(null character),C语言用它标记字符串的结束。空字符不是数字0,它是非打印字符,其ASCII码值是(或等价于)0。C中的字符串一定以空字符结束这意味着数组的容量必须至少比待存储字符串中的字符数多1。因此,程序清单4.1中有40个存储单元的字符串,只能储存39个字符,剩下一个字节留给空字符。
        那么,什么是数组?可以把数组看作是一行连续的多个存储单元。用更正式的说法是,数组是同类型数据元素的有序序列。程序清单4.1通过以下声明创建了一个包含40个存储单元(或元素)的数组,每个单元储存一个char类型的值:
char name[40];
name 后面的方括号表明这是一个数组,方括号中的40表明该数组中的元素数量。char 表明每个元
素的类型。

字符串的格式化输入/输出_第3张图片

         字符串看上去比较复杂!必须先创建一个数组,把字符串中的字符逐个放入数组,还要记得在末尾加上一个\0。计算机可以自己处理这些细节。

2 .使用字符串

        程序清单:

#include
#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;
}

        %s告诉printf()打印一个字符串。%s 出现了两次,因为程序要打印两个字符串:一个储存在name数组中;一个由 PRAISE 来表示。运行,其输出如下所示:

字符串的格式化输入/输出_第4张图片

        你不用亲自把空字符放入字符串末尾,scanf()在读取输入时就已完成这项工作。也不用在字符事常量PRAISE末尾添加空字符。稍后我们会解释#define 指令,现在先理解PRAISE 后面用双引号括起来的文本是一个字符串。编译器会在末尾加上空字符。
        注意(这很重要),scanf()只读取了Angela Plains 中的Angela,它在遇到第1个空白(空格、制表符或换行符)时就不再读取输入。因此,scanf()在读到Angela和Plains 之间的空格时就停止了。一般而言,根据%s转换说明,scanf()只会读取字符串中的一个单词,而不是一整句。C语言还有其他的输入函数(如,fgets()),用于读取一般字符串。后面章节将详细介绍这些函数。
字符串和字符
字符串常量"x"和字符常量'x'不同。区别之一在于'x'是基本类型(char),而"x"是派生类型(char
数组);区别之二是"x"实际上由两个字符组成:‘x'和空字符\0。

字符串的格式化输入/输出_第5张图片

你可能感兴趣的:(c语言,开发语言)