//4-1.c ---一个能为您提供信息的对话程序
#include <stdio.h>
#include <string.h>     //提供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 ("%f",&weight);
       size = sizeof name ;
       letters = strlen (name);
       volume = weight / DENSITY;
       printf ("Well ,%s,your volume ix %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 in .\n",size);
       return 0 ;
}
/*程序新特点
   使用了一个数组来存放一个字符串,使用%s转换说明符来处理字符串的输入与输出
   使用预处理器定义了一个字符常量,使用C函数strlen ()来获取字符串常量*/
 
字符串简介
     字符串就是一个或多个字符的序列,如:“Zing went the strings or my heart?”双引号不是字符串的一部分。它们只是通知编译器其中包含了一个字符串,正如单引号标识一个字符一样。
C没有为字符串定义专门的数据类型,而是把他们存放在char 数组中,字符串中的字符存放在相领的存储单元中,每个字符占用一个单元。而数组由相邻的存储单元组成
     

Z
i
n
g
 
w
e
n
t
 
t
h
e
 
s
t
i
n
g
 
o
f
 
m
y
 
h
e
a
t
!
\o

                                                                                                                                                        
每个单元是1个字节                                                                                                               空字符
图中最后一个位置显示字符\0.这个字符是空字符,C用它来标识字符的结束,所以数组的单元数必须至少要比存储的字符多1。空字符不是数字0;它是非打印字符,但是ASCII码值为0。
数组:同一数据类型的数据元素的有序的序列既,一行中有多个存储单元。本程序用char name [40] ;语句声明创建了一个有40个存储单元的数组,其中每个单元可以存储一个char类型的值。Name后面的方括号说明它是一个数组,方括号内的40指出数组中的元素数目,char标识每个元素的类型。
 
//4-2.c ---- 使用不同类别的字符串
#include <stdio.h>
#define PRAISE "What a super marvelous name!"
int main (void)
{
       char name[40];
 
       printf ("What's your name ?\n");
       scanf ("%s",name);
       printf ("Hello, %s.%s\n",name,PRAISE);
       return 0 ;
}
 
运行结果
What's your name ?
chen wang quen      这个是自己输入的
Hello, chen.What a super marvelous name!   但是这一样只有chen显示出来了
Press any key to continue
 
为什么会出现这们的现象:因为scanf开始读取输入以后,当读到一个空白字符空格或制表符或换行符处停止读取。一般情况下使用%s的scanf ()只会读取一个单词而不会把整个语句作为一个字符串读取。可以用其它的函数如(gets ())来处理一般的字符串。
字符与字符串的出别:
字符是基本类型(char),而字符串是派生类型(char数组)。字符串中多一个字符既空字符。
 
Strlen ()函数
Sizeof 运算符。它以字节为单位给出数据大小。Strlen()函数以字符为单位给出字符串长度。
 
 
//4-3.c ---- strlen()与sizeof
 
#include <stdio.h>
#include <string.h>   //提供strlen ()函数原型
#define PRAISE "What a supe marvelous name!"
int main (void)
 
{
       char name [40];
 
 
       printf ("What's your name ?\n");
       scanf ("%s",name);
       printf ("Hello ,%s.%s\n",name,PRAISE);
       printf ("Your name of %d letters occuipes %d memory cells.\n",strlen (name),
sizeof name);
       printf ("The phrase of prase has %d letters",strlen (PRAISE));
       printf ("and occuipes %d memory cells .\n",sizeof (PRAISE));
       return 0 ;
}
Printf ()长语句的处理方法:第一个方法占两行,从参数之间断开一行,但不要从双引号中断开,第二个方法
     写两个printf ()语句来输出换行符只出现在第二个语句中。
根据sizeof运算报告:数组name有40个内存单元。不过只用前几个单元,第二strlen()的运算报告和第二个sizeof 运算报告的数值总是strler()输出的值大1,这是因为字符串中多了一个用来标识字符结束的空字符/0.