一.示例程序
#include<stdio.h>
#include<string.h>
#define DENSITY 62.4
int main()
{
float weight,volume;
int size,letters;
char name[40];
printf("Hi!what is your first name?\n");
scanf("%s",name);
printf("%s,what is your weight in prounds?\n",name);
scanf("%f",&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 in.\n",size);
return 0;
}
该程序的新特性:
1.使用一个数组来存放字符串,可以存放40个字节,每个字节都可以存放一个字符值。
2.使用%s转换说明符来处理字符串输入和输出。
3.使用预处理器定义
4.使用strlen()这个函数来获取字符串长度。
二.字符串入门
1.字符串的定义
字符串是一个或者多个字符的序列。
c语言没有专门为字符串定义变量类型,而是把他们都存放在char数组中,每个字符占用一个单元。字符串的最后一个位置显示
字符\0,是空字符,其ASCII码的值位0,c用它来标记字符串的结束。
2.使用字符串
#include<stdio.h>
#define PRAISE "what a super marvelous name!"
int main(void)
{
char name[40];
printf("what is your name?\n");
scanf("%s",name);
printf("hello,%s.%s\n",name,PRAISE);
return 0;
}
scanf()只读取了xxx xx中的xxx。scanf()开始读取输入以后,会在遇到第一个空白字符空格(blank),制符表(tab)或者换
行符(newline)处停止读取。
3.使用strlen()函数
#include<stdio.h>
#include<string.h>
#define PRAISE "what a super marvelous name!"
int main(void)
{
char name[40];
printf("what is your name?\n");
scanf("%s",name);
printf("hello,%s.%s\n",name,PRAISE);
printf("your name of %d letters occupies %d memory cells.\n",strlen(name),sizeof name);
printf("the phrase of praise has %d letters",strlen(PRAISE));
printf("and occupise %d memory cells.\n",sizeof PRAISE);
return 0;
}
size(xx)和size xx的区别在于是获取一个类型的大小还是某个具体量的大小。()对于类型是必选的,但是对于具体的量是可
选的,也就是说必需使用sizeof(char)或者sizeof(float),但是可以选择sizeof name或者 sizeof 6.28.
三.常量和预处理器
格式:#define NAME value
name一般是用大写,立即知道是一个常量而不是一个变量,使程序更容易阅读。
#include<stdio.h>
#define PI 3.14159
int main(void)
{
float area,circum,radius;
printf("what is the radius of your pizza?\n");
scanf("%f",&radius);
area=PI*radius*radius;
circum=2.0*PI*radius;
printf("your basic pizza parameters are as follows:\n");
printf("circumference=%1.2f,area=%1.2f\n",circum,area);
return 0;
}
define也可以用于定义字符和字符串常量
#define BEEF 't'
#define POP "tran"
C90新增的创建常量的方法为const,即使用关键字const把一个变量声明转换为常量声明
例如 const int MONTHS=12;
这样就使MONTHS变成了一个只读值,只能读取其值但是不能改变他的值。
c的头文件limits.h和float.h分别提供了有关整数类型和浮点类型的大小限制的详细信息,该文件提供了整数类型的最大值和
最小值得常量定义
#include<stdio.h>
#include<limits.h>
#include<float.h>
int main(void)
{
printf("some number limits for this system:\n");
printf("biggest int:%d\n",INT_MAX);
printf("one byte=%d bits on this system.\n",CHAR_BIT);
printf("largest double:%e\n",DBL_MAX);
printf("smallest normal float:%e\n",FLT_MIN);
printf("float epsilon=%e\n",FLT_EPSILON);
return 0;
}
四.深入printf()和scanf()
1.printf()函数
#include<stdio.h>
#define PI 3.141593
int main(void)
{
int number=5;
float expresso=13.5;
int cost=3100;
printf("the %d CEOS drank %f cups of expresso.\n",number,expresso);
printf("the value of pi is %f.\n,",PI);
printf("farewell! thou art too dear for my possessing,\n");
printf("%c%d\n",'$',2*cost);
return 0;
}
控制字符串语句应该为每个要打印的项目包含一个转换说明符(即要一一对应)。如果要单独打印%字符,需要输入%%。
2.printf()函数的转换说明修饰符
#include<stdio.h>
#define PAGES 931
int main(void)
{
printf("*%d\n",PAGES);
printf("*%2d\n",PAGES);
printf("*%10d\n",PAGES);
printf("*%-10d\n",PAGES);
return 0;
}
第一个转换说明符是不带修饰符的%d,生成一个与打印整数宽度相同的字段。
第二个转换说明符是%2d,它指示应该产生宽度为2的字段。
第三个转换说明符是%10d,产生一个10个空格宽的字段,并且数字位于整个字段的后面。
第四个转换说明符是%-10d,产生一个10个空格宽的字段,不过数字位于整个字段的前面。
#include<stdio.h>
int main(void)
{
const double RENT=3852.99;
printf("*%f*\n",RENT);
printf("*%e*\n",RENT);
printf("*%4.2f*\n",RENT);
printf("*%3.1f*\n",RENT);
printf("*%10.3f*\n",RENT);
printf("*%10.3e*\n",RENT);
printf("*%+4.2f*\n",RENT);
printf("*%010.2f*\n",RENT);
return 0;
}
%f默认格式有两个:字段宽度和小数点右边的数字的数目。
%e默认格式为小数点左侧打印一个数字,小数点右侧打印6个数字。
+标志使得结果数字和它的代数符号一起打印,0标志产生前导零以使结果填充整个字段。在说明符%010中第一个0第一个标志,
剩余的数字指定字段宽度。
#include<stdio.h>
int main(void)
{
printf("%x %X %#x\n",31,31,31);
printf("**%d**% d**% d**\n",42,42,-42);
printf("**%5d**%5.3d**%05d**%05.3d**\n",6,6,6,6);
return 0;
}
第二行示范了如何在说明符中使用空格以在正值之前产生一个前导空格。
第三行说明如何在整数格式中使用精度说明符来产生足够的前导零以填满要求的最小数字位数。
#include<stdio.h>
#define BLURB "Authentic imitation!"
int main(void)
{
printf("/%2s/\n",BLURB);
printf("/%24s/\n",BLURB);
printf("/%24.5s/\n",BLURB);
printf("/%-24.5s/\n",BLURB);
return 0;
}
3.转换说明的意义
它把存储在计算机中的二进制格式的数值转换成一系列字符以便于显示。
不匹配转换会导致很多问题,例如一下两个:
#include<stdio.h>
#define PAGES 336
#define WORDS 65618
int main(void)
{
short num=PAGES;
short mnum=-PAGES;
printf("num as short and unsigned short:%hd %hu\n",num,num);
printf("-num as short and unsigned short:%hd %hu\n",mnum,mnum);
printf("num as int and char:%d %c\n",num,num);
printf("WORDS an int,short,and char: %d %hd %c\n",WORDS,WORDS,WORDS);
return 0;
}
#include<stdio.h>
int main(void)
{
float n1=3.0;
double n2=3.0;
long n3=2000000000;
long n4=1234567890;
printf("%.le %.1e %.1e %.1e\n",n1,n2,n3,n4);
printf("%ld %ld\n",n3,n4);
printf("%ld %ld %ld %ld\n",n1,n2,n3,n4);
return 0;
}
4.printf()的返回值
#include<stdio.h>
int main(void)
{
int bph2o=212;
int rv;
rv=printf("%d F is water is boiling point.\n",bph2o);
printf("the printf() function printed %d characters.\n",rv);
return 0;
}
首先程序使用rv=printf()将返回值赋给了rv,因此后面一条语句将输出前一条printf()语句的值。
5.打印较长的字符串
#include<stdio.h>
int main(void)
{
printf("here is one way to print a ");
printf("long string.\n");
printf("here is one way to print a \
long string\n");
printf("here is the newest way to print a "
"long string.\n");
return 0;
}
方法一是使用多个printf()语句。
方法二是使用反斜线符号/和回合键的组合来结束第一行。(注意缩进)
方法三是采用字符串连接的方法
6.scanf()的使用
#include<stdio.h>
int main(void)
{
int age;
float assets;
char pet[30];
printf("Enter your age,assets,and favorite pet.\n");
scanf("%d %f",&age,&assets);
scanf("%s",pet);
printf("%d $%.2f %s\n",age,assets,pet);
return 0;
}
scanf()使用换行,制表符和空格来决定怎么样把输入分成几个字段。它依次把转换说明与字段想匹配,并跳过它们之间的空格
。
从工作原理上看,假如使用一个%d来读取一个整数,它期望发现一个数字字符或者一个符号,若发现那它就保存并且读取下一
个字符,这样scanf()就持续读取和保存字符直到它遇到一个非数字字符。若果遇到一个非数字字符,则返回前一个字符并且把
之前的全部输入如果第一个非空字符不是数字而是字母A,则他会一直读取A而不会越过他。
使用%s说明符,那么空白字符之外的所有字符都是可以接受的。
如果使用%c说明符,那么所有的输入字符都是平等的。如果下一个输入字符是一个空格或者换行符,将会把这个空格或换行符
赋给指定的变量,不会跳过空白字符。
7.scanf()和printf()的*修饰符
#include<stdio.h>
int main(void)
{
unsigned width,precision;
int number=256;
double weight=242.5;
printf("what field width?\n");
scanf("%d",&width);
printf("the number is:%*d: \n",width,number);
printf("now enter a width and a precision: \n");
scanf("%d %d",&width,&precision);
printf("weight=%*.*f\n",width,precision,weight);
return 0;
}
如果事先不像指定字段宽度,而希望有程序指定该值,那么可以在字段宽度部分用*代替数字来达到目的,但必须使用一个参数
来告诉函数字段的宽度。
#include<stdio.h>
int main(void)
{
int n;
printf("Please enter three integers:\n");
scanf("%*d %*d %d",&n);
printf("the last integer was %d\n",n);
return 0;
}
在scanf()中*提供截然不同的服务。当把它放在%和说明符字母之间时,它使函数跳过相应的输入项目。
#include<stdio.h>
#include<string.h>
#define DENSITY 62.4
int main()
{
float weight,volume;
int size,letters;
char name[40];
printf("Hi!what is your first name?\n");
scanf("%s",name);
printf("%s,what is your weight in prounds?\n",name);
scanf("%f",&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 in.\n",size);
return 0;
}
该程序的新特性:
1.使用一个数组来存放字符串,可以存放40个字节,每个字节都可以存放一个字符值。
2.使用%s转换说明符来处理字符串输入和输出。
3.使用预处理器定义
4.使用strlen()这个函数来获取字符串长度。
二.字符串入门
1.字符串的定义
字符串是一个或者多个字符的序列。
c语言没有专门为字符串定义变量类型,而是把他们都存放在char数组中,每个字符占用一个单元。字符串的最后一个位置显示
字符\0,是空字符,其ASCII码的值位0,c用它来标记字符串的结束。
2.使用字符串
#include<stdio.h>
#define PRAISE "what a super marvelous name!"
int main(void)
{
char name[40];
printf("what is your name?\n");
scanf("%s",name);
printf("hello,%s.%s\n",name,PRAISE);
return 0;
}
scanf()只读取了xxx xx中的xxx。scanf()开始读取输入以后,会在遇到第一个空白字符空格(blank),制符表(tab)或者换
行符(newline)处停止读取。
3.使用strlen()函数
#include<stdio.h>
#include<string.h>
#define PRAISE "what a super marvelous name!"
int main(void)
{
char name[40];
printf("what is your name?\n");
scanf("%s",name);
printf("hello,%s.%s\n",name,PRAISE);
printf("your name of %d letters occupies %d memory cells.\n",strlen(name),sizeof name);
printf("the phrase of praise has %d letters",strlen(PRAISE));
printf("and occupise %d memory cells.\n",sizeof PRAISE);
return 0;
}
size(xx)和size xx的区别在于是获取一个类型的大小还是某个具体量的大小。()对于类型是必选的,但是对于具体的量是可
选的,也就是说必需使用sizeof(char)或者sizeof(float),但是可以选择sizeof name或者 sizeof 6.28.
三.常量和预处理器
格式:#define NAME value
name一般是用大写,立即知道是一个常量而不是一个变量,使程序更容易阅读。
#include<stdio.h>
#define PI 3.14159
int main(void)
{
float area,circum,radius;
printf("what is the radius of your pizza?\n");
scanf("%f",&radius);
area=PI*radius*radius;
circum=2.0*PI*radius;
printf("your basic pizza parameters are as follows:\n");
printf("circumference=%1.2f,area=%1.2f\n",circum,area);
return 0;
}
define也可以用于定义字符和字符串常量
#define BEEF 't'
#define POP "tran"
C90新增的创建常量的方法为const,即使用关键字const把一个变量声明转换为常量声明
例如 const int MONTHS=12;
这样就使MONTHS变成了一个只读值,只能读取其值但是不能改变他的值。
c的头文件limits.h和float.h分别提供了有关整数类型和浮点类型的大小限制的详细信息,该文件提供了整数类型的最大值和
最小值得常量定义
#include<stdio.h>
#include<limits.h>
#include<float.h>
int main(void)
{
printf("some number limits for this system:\n");
printf("biggest int:%d\n",INT_MAX);
printf("one byte=%d bits on this system.\n",CHAR_BIT);
printf("largest double:%e\n",DBL_MAX);
printf("smallest normal float:%e\n",FLT_MIN);
printf("float epsilon=%e\n",FLT_EPSILON);
return 0;
}
四.深入printf()和scanf()
1.printf()函数
#include<stdio.h>
#define PI 3.141593
int main(void)
{
int number=5;
float expresso=13.5;
int cost=3100;
printf("the %d CEOS drank %f cups of expresso.\n",number,expresso);
printf("the value of pi is %f.\n,",PI);
printf("farewell! thou art too dear for my possessing,\n");
printf("%c%d\n",'$',2*cost);
return 0;
}
控制字符串语句应该为每个要打印的项目包含一个转换说明符(即要一一对应)。如果要单独打印%字符,需要输入%%。
2.printf()函数的转换说明修饰符
#include<stdio.h>
#define PAGES 931
int main(void)
{
printf("*%d\n",PAGES);
printf("*%2d\n",PAGES);
printf("*%10d\n",PAGES);
printf("*%-10d\n",PAGES);
return 0;
}
第一个转换说明符是不带修饰符的%d,生成一个与打印整数宽度相同的字段。
第二个转换说明符是%2d,它指示应该产生宽度为2的字段。
第三个转换说明符是%10d,产生一个10个空格宽的字段,并且数字位于整个字段的后面。
第四个转换说明符是%-10d,产生一个10个空格宽的字段,不过数字位于整个字段的前面。
#include<stdio.h>
int main(void)
{
const double RENT=3852.99;
printf("*%f*\n",RENT);
printf("*%e*\n",RENT);
printf("*%4.2f*\n",RENT);
printf("*%3.1f*\n",RENT);
printf("*%10.3f*\n",RENT);
printf("*%10.3e*\n",RENT);
printf("*%+4.2f*\n",RENT);
printf("*%010.2f*\n",RENT);
return 0;
}
%f默认格式有两个:字段宽度和小数点右边的数字的数目。
%e默认格式为小数点左侧打印一个数字,小数点右侧打印6个数字。
+标志使得结果数字和它的代数符号一起打印,0标志产生前导零以使结果填充整个字段。在说明符%010中第一个0第一个标志,
剩余的数字指定字段宽度。
#include<stdio.h>
int main(void)
{
printf("%x %X %#x\n",31,31,31);
printf("**%d**% d**% d**\n",42,42,-42);
printf("**%5d**%5.3d**%05d**%05.3d**\n",6,6,6,6);
return 0;
}
第二行示范了如何在说明符中使用空格以在正值之前产生一个前导空格。
第三行说明如何在整数格式中使用精度说明符来产生足够的前导零以填满要求的最小数字位数。
#include<stdio.h>
#define BLURB "Authentic imitation!"
int main(void)
{
printf("/%2s/\n",BLURB);
printf("/%24s/\n",BLURB);
printf("/%24.5s/\n",BLURB);
printf("/%-24.5s/\n",BLURB);
return 0;
}
3.转换说明的意义
它把存储在计算机中的二进制格式的数值转换成一系列字符以便于显示。
不匹配转换会导致很多问题,例如一下两个:
#include<stdio.h>
#define PAGES 336
#define WORDS 65618
int main(void)
{
short num=PAGES;
short mnum=-PAGES;
printf("num as short and unsigned short:%hd %hu\n",num,num);
printf("-num as short and unsigned short:%hd %hu\n",mnum,mnum);
printf("num as int and char:%d %c\n",num,num);
printf("WORDS an int,short,and char: %d %hd %c\n",WORDS,WORDS,WORDS);
return 0;
}
#include<stdio.h>
int main(void)
{
float n1=3.0;
double n2=3.0;
long n3=2000000000;
long n4=1234567890;
printf("%.le %.1e %.1e %.1e\n",n1,n2,n3,n4);
printf("%ld %ld\n",n3,n4);
printf("%ld %ld %ld %ld\n",n1,n2,n3,n4);
return 0;
}
4.printf()的返回值
#include<stdio.h>
int main(void)
{
int bph2o=212;
int rv;
rv=printf("%d F is water is boiling point.\n",bph2o);
printf("the printf() function printed %d characters.\n",rv);
return 0;
}
首先程序使用rv=printf()将返回值赋给了rv,因此后面一条语句将输出前一条printf()语句的值。
5.打印较长的字符串
#include<stdio.h>
int main(void)
{
printf("here is one way to print a ");
printf("long string.\n");
printf("here is one way to print a \
long string\n");
printf("here is the newest way to print a "
"long string.\n");
return 0;
}
方法一是使用多个printf()语句。
方法二是使用反斜线符号/和回合键的组合来结束第一行。(注意缩进)
方法三是采用字符串连接的方法
6.scanf()的使用
#include<stdio.h>
int main(void)
{
int age;
float assets;
char pet[30];
printf("Enter your age,assets,and favorite pet.\n");
scanf("%d %f",&age,&assets);
scanf("%s",pet);
printf("%d $%.2f %s\n",age,assets,pet);
return 0;
}
scanf()使用换行,制表符和空格来决定怎么样把输入分成几个字段。它依次把转换说明与字段想匹配,并跳过它们之间的空格
。
从工作原理上看,假如使用一个%d来读取一个整数,它期望发现一个数字字符或者一个符号,若发现那它就保存并且读取下一
个字符,这样scanf()就持续读取和保存字符直到它遇到一个非数字字符。若果遇到一个非数字字符,则返回前一个字符并且把
之前的全部输入如果第一个非空字符不是数字而是字母A,则他会一直读取A而不会越过他。
使用%s说明符,那么空白字符之外的所有字符都是可以接受的。
如果使用%c说明符,那么所有的输入字符都是平等的。如果下一个输入字符是一个空格或者换行符,将会把这个空格或换行符
赋给指定的变量,不会跳过空白字符。
7.scanf()和printf()的*修饰符
#include<stdio.h>
int main(void)
{
unsigned width,precision;
int number=256;
double weight=242.5;
printf("what field width?\n");
scanf("%d",&width);
printf("the number is:%*d: \n",width,number);
printf("now enter a width and a precision: \n");
scanf("%d %d",&width,&precision);
printf("weight=%*.*f\n",width,precision,weight);
return 0;
}
如果事先不像指定字段宽度,而希望有程序指定该值,那么可以在字段宽度部分用*代替数字来达到目的,但必须使用一个参数
来告诉函数字段的宽度。
#include<stdio.h>
int main(void)
{
int n;
printf("Please enter three integers:\n");
scanf("%*d %*d %d",&n);
printf("the last integer was %d\n",n);
return 0;
}
在scanf()中*提供截然不同的服务。当把它放在%和说明符字母之间时,它使函数跳过相应的输入项目。