学习的语言:C
编译环境:visual Studio 2013
选择的书籍:C Primer Plus(作者:Stephen Prata)
------------------------------------------第4篇--------------------------------------------------------------------------
学习内容:
字符串
常量和C预处理器
再谈printf()和scanf() 其中涉及函数的参数传递和返回值
先上一段核心代码
#include "stdio.h"
#include "string.h"//使用strlen()函数必须引入的库
#define DENSITY 1.1//预处理命令:设置一个常量DENSITY,表示人体密度
int main(void)//完成用户姓名的输入,计算人的体积
{
char name[20]; int weight;float volume;
int len;//名字长度
printf("请输入你的名字:__________\b\b\b\b\b\b\b\b\b\b\b");
scanf("%s", name);
len = strlen(name);
printf("尊敬的%s,你好!你的名字长度是:%d\n我们这个程序是要计算你的体积,请你告知我们,你的体重是多少(KG)?\n",name,len);
scanf("%d", &weight);
volume = weight / DENSITY;
printf("您的体积是:%.2f", volume);
fflush(stdin);
getchar();
return 0;
}
一、字符串
1、字符串使用双引号括起来的,告诉编译器它是字符串。
2、C语言中没有专门用来储存字符串的变量类型。字符串被储存在char类型的数组中。
3、什么是数组?数组就是有连续的储存单元(一个字节)组成。字符串中的字符被储存在相邻的储存单元中,每一个储存单元一个字符。数组可以看成是同类型数据元素的有许序列。
数组的表示方法:char name [40] name后面的方括号表示这是一个数组。40表示元素数量
4、在字符串的末尾是‘\0’(空字符),他的作用是标记字符串的结束。所以40个储存单元,只能存放39个字符,还有一个储存单元要留给空字符。
#include <stdio.h>
#define NICKNAME "skydragon"
int main(void)
{
char name[20];
printf("请输入你的名字:");
scanf("%s",name);
printf("%s,你好!,我可以叫你%s吗?",name,NICKNAME);
return 0;
}
注意:scanf()遇到空格、制表符或者换行符就不再输入了。当我们输入名字“sky dragon”时,scanf()只是输入了sky这三个字符给name变量。
5、strlen()函数:计算字符串中空字符前面的字符个数。
二、常量和C预处理器
常量分为两种,一种是直白的数字,另一种是符号常量。符号常量有两个有点,第一就是他表示的常量是可以直白的看出常量含义的,第二就是好更改。
而符号常量的定义有分两种,一种是声明变量的方法。还有一种就是#define这种预处理器定义常量值。
何为预处理?预处理器的工作是什么?其实就是在编译器编译之前,把常量做一个替换。
const限制符:用法 const int NUM1 = 233; 限定变量为只读。
三、再谈printf函数和scanf函数
1、printf函数: 他的参数包括,printf(“格式化字符串”,待打印项 ); 待打印项可以是常量,变量,表达式。
1.1、printf的修饰符:有好一些,可以实现不同的输出格式,这个有需要自己去查。
1.2、转换说明的意义:把以二进制格式存储在计算机中的值转换成一些列的字符或者字符串。也就是待打印项在计算机是以二进制储存的,然后要想把它按照相应的格式打印出来,必须有一个转换说明,计算机才可以正常执行翻译操作。
1.3、参数传递:程序把传入的值放入被称为栈(stack)的内存区域。其中值的被放入多大的内存空间由变量的类型决定,例如int类型的变量就分配4个储存单位。然后这些被储存在栈的数据等待printf函数的调用,例如此时转换说明为%d,则printf函数从栈中读取四个字节的内容作为这个变量的值。
1.4、返回值:printf函数的返回值,是打印字符的个数。这个值可以赋值给其他变量,来确定输出是否错误(错误的话会返回一个负值)。下面看一下函数返回值的赋值代码。
int main(void)//测试printf函数的返回值
{
int rv;//返回值赋值的变量
int x=10;
rv = printf("输出定义的整形变量%d\n", x);
printf("printf函数的返回值%d", rv);
fflush(stdin);
getchar();
return 0;
}
1.5、printf函数换行的方法:这可以自行百度。
2、scanf函数
功能实现与printf函数相反,它把输入的字符转换成二进制数值,储存在特定的内存区域。
也有格式字符串和参数列表。格式字符串表面字符输入流的目标数据类型。参数,指向变量的指针。
工作原理:假设scanf根据一个%d转换说明读取一个整数。scanf每次读取一个字符,直到遇到第一个非空白字符开始保存字符。然后不断地读取保存下一个字符,直至遇到非数字字符停止读取和输入。如果最后的字符是非数字字符,那么scanf会把非数字字符放回输入,这意味着程序在下一次读取输入时,首先读到的是是上一次读取丢弃的非数字字符。
特别要注意的是,输入字符数组不用使用“&”。下面是代码演示:
int main(void)//scanf函数练习
{
int x;//储存一个整形
char name[20]//储存字符串
scanf("%d,%s",&x,name);//输入一个十进制整形,输入一串字符
printf("%d,%s",x,name);//打印
fflush(stdin);
getchar();
return 0;
}
scanf的返回值:调用成功时,返回成功读取的项数;调用失败,则返回0。下面是代码演示:
int main(void)//测试scanf函数
{
int x,y;
int rv;//储存返回值的变量
rv=scanf("%d", &x);
printf("scanf这次调用的返回值是%d\n", rv);
rv = scanf("%d%d", &x, &y);
printf("scanf这次调用的返回值是%d", rv);
fflush(stdin);
getchar();
return 0;
}