预处理指令、构建大型程序
练习:编写程序从键盘得到一个包含多个考试成绩的字符串,字符串格式如下
10,20,30,40,50
计算所有考试成绩的和并把结果显示在屏幕上
练习:编写一个模拟登录练习,一共给用户三次登录机会,每次要求用户输入用户名和密码如果输入的用户名是admin密码是123456就是正确的。登陆三次之后要给出提示。
指针数组
指针数组里每个存储区的类型都是指针,字符指针数组里包含多个字符类型的指针,每个指针可以代表一个字符串。字符指针数组可以用来表示多个相关字符串,二维数组也可以用来表示多个相关字符串,通常使用字符指针数组来记录多个字符串防止存储区浪费。
主函数参数
主函数的第二个参数是一个字符指针数组,其中每个指针代表一个字符串。所有这些字符串的内容都来自用户输入命令。主函数第一个参数是一个整数,表示第二个参数里的指针个数。
练习:编写程序解决鸡兔同笼问题
头和脚的数量应该从命令中获得
./a.out 40 100
预处理指令
“#define”预处理指令可以用来定义宏,宏可以用来给数字起名字,定义宏的时候要把宏名称写在前面,把它所代表的数字写在后面。宏名称通常由全英文大写字符构成,宏名称里不包含空格。
#define PI 3.14f
用宏给数字起名字的时候不可以用赋值操作符,编译器会把程序里的所有宏名称替换成它所代表的数字,可以在编译命令里使用-D选项决定宏名称代表的数字。
编写程序的时候有些数字只能在编译的时候才能知道具体数值,程序中应该用宏名称代表这种数字。宏还可以用来给计算公式起名字,计算公式里包含未知数字,宏的参数用来表示计算公式里的未知数字。
编译器采用二次替换的方式处理带参数的宏,宏的参数不一定代表数字所以没有类型名称。如果宏有多个参数也应该用逗号把相邻的参数名称分隔开。
宏与函数区别
宏不能使用自己的存储区和函数之间进行数据交换,宏没有形式参数也没有用来存放返回值的存储区,能当作数字使用的宏必须编写为表达式(因为宏没有用来存放返回值的存储区),宏的参数可以直接代表函数的存储区,对宏参数内容的修改就是对函数存储区内容的修改。
练习:编写一个宏用来计算两个整数之间的差
因为宏没有用来记录返回值的存储区,所以不能保证优先计算宏里面的操作符。所有能当作数字使用的宏必须编写在一对小括号中间,宏没有形式参数所以不能保证优先计算参数里面的操作符。编写宏的时候所有能当作数字使用的参数也必须写在小括号里。不要把自增自减的结果作为宏的参数使用
编写宏的时候可以使用一些特殊的符号,他们叫做宏操作符。
#是一个宏操作符,它可以把宏的一个参数转换成字符串字面值
##也是一个宏操作符,它可以把一个代表标识符的参数连接其他内容得到一个新的标识符
练习:编写宏实现字符的大小写转换
点击查看代码
#if 0
/*
*字符串练习
*
* */
#include<stdio.h>
#include<string.h>
int main() {
char buf[30] = {0},tmp[10] = {0};
int grade = 0;
while(1) {
printf("请输入一个考试成绩:");
scanf("%d",&grade);
if(grade >= 0 && grade <= 100) {
sprintf(tmp,"%d,",grade);
strcat(buf,tmp);
}
else {
break;
}
}
buf[strlen(buf) - 1] = 0; //最后一个成绩后的逗号删除
printf("%s\n",buf);
return 0;
}
#elif 0
/*
*
*字符串练习
*
* */
#include<stdio.h>
int main() {
char buf[50] = {0};
char *p_ch = buf;
int sum = 0,tmp = 0;
printf("请输入字符串:");
fgets(buf,50,stdin);
while(*p_ch) {
if(*p_ch >= '0' && *p_ch <= '9') {
tmp = (10 * tmp + *p_ch - '0');
}
else {
sum += tmp;
tmp = 0;
}
p_ch++;
}
printf("%d\n",sum);
return 0;
}
#elif 0
/*
*
*字符串函数练习
*
* */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main() {
char buf[50] = {0};
char *p_ch= buf;
int sum = 0;
printf("请输入字符串:");
fgets(buf,50,stdin);
while(1) {
sum += atoi(p_ch);
p_ch = strstr(p_ch,",");
if(!p_ch) {
break;
}
else {
p_ch++;
}
}
printf("sum = %d\n",sum);
return 0;
}
#elif 0
/*
*
*模拟登录
*
* */
#include<stdio.h>
#include<string.h>
int main() {
char buf[10] = {0};
int num = 0;
for(num = 1;num <= 3;num++) {
printf("请输入用户名:");
fgets(buf,10,stdin);
if(strlen(buf) == 9 && buf[8] != '\n') {
scanf("%*[^\n]");
scanf("%*c");
}
if (strcmp(buf,"admin\n")) {
continue;
}
printf("请输入密码:");
fgets(buf,10,stdin);
if(strlen(buf) == 9 && buf[8] != '\n') {
scanf("%*[\n]");
scanf("%*c");
}
if(strcmp(buf,"123456\n")) {
continue;
}
break;
}
if(num <= 3) {
printf("登录成功\n");
}
else {
printf("登录失败\n");
}
return 0;
}
#elif 0
/*
*
*字符指针数组演示
*
* */
#include<stdio.h>
int main (){
/*char *strs[] = {"abc","def","xyz","iop","vbn"}; //字符指针数组 */
char strs[][10] = {"abc","ded","vbn","zxh","sfd"};
int num = 0;
for (num = 0;num <= 4;num++){
printf("%s\n",strs[num]);
}
return 0;
}
#elif 0
/*
*
*主函数参数
*
* */
#include<stdio.h>
int main (int argc,char *argv[]){
int num = 0;
for (num = 0;num <= argc - 1;num++){
printf("%s\n",argv[num]);
}
return 0;
}
#elif 0
/*
*
*鸡兔同笼
*
* */
#include<stdio.h>
#include<stdlib.h>
int main (int argc,char *argv[]){
int heads = 0,legs = 0,num = 0;
if (argc < 3){
printf("命令错误\n");
return 0;
}
heads = atoi(argv[1]);
legs = atoi(argv[2]);
for (num = 0;num <= heads;num++){
if (4 * num +2 * (heads - num) == legs){
printf("兔子有%d鸡有%d\n",num,heads - num);
break;
}
}
return 0;
}
#elif 0
/*
*
*宏定义
*
*
* */
#include<stdio.h>
#define PI 3.14f
#define CIRCLE(r) 2 * PI *r
int main (){
float radius = 0.0f;
printf("请输入半径:");
scanf("%g",&radius);
printf("周长是%g\n",CIRCLE(radius));
return 0;
}
#elif 0
/*
*
*宏演示
*
* */
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main (){
int arr[SIZE] = {0};
int num = 0;
srand(time(0));
for (num = 0;num <= SIZE - 1;num++){
arr[num] = rand() % MAX +1;
}
for (num = 0;num <= SIZE -1;num++){
printf(" %d ",arr[num]);
}
printf("\n");
return 0;
}
#elif 0
/*
*
*宏演示
*
* */
#include<stdio.h>
#define ABS(n) n >= 0 ? n : 0 - n
#define NEG(n) n = 0 - n
int abs (int num){
if (num >= 0){
return num;
}
else{
return (0 - num);
}
}
void neg (int *p_num){
*p_num = 0 - *p_num;
}
int main (){
int num = 0;
printf("请输入一个数字:");
scanf("%d",&num);
printf("%d\n",abs(num));
printf("%d\n",ABS(num));
neg(&num);
printf("%d\n",num);
NEG(num);
printf("%d\n",num);
return 0;
}
#elif 0
/*
*宏练习
*
* */
#include<stdio.h>
#define SUB(x,y) ((x) -(y))
int main (){
printf("%d\n",SUB(10,5));
printf("%d\n",20 - SUB(10,5));
printf("%d\n",20 - SUB(10,5));
printf("%d\n",SUB(20,10 -5));
return 0;
}
#elif 0
/*
*
*计算整数平方
*
* */
#include<stdio.h>
#define SQUARE(n) (n) * (n)
int main (){
int num = 5;
printf("%d\n",SQUARE(num));
printf("%d\n",SQUARE(++num));
return 0;
}
#elif 0
/*
*
*宏操作符演示
*
* */
#include<stdio.h>
#define STR(n) #n
#define PTR(n) p_##n
int main (){
STR(2+3);
int num = 0;
int *PTR(num) = #
return 0;
}
#elif 1
/*
*
*宏转换大小写
*
* */
#include<stdio.h>
#define CASE(ch) ((ch) >= 'a' && (ch) <= 'z' ? (ch) - 'a' + 'A' : (ch) - 'A' + 'a')
int main (){
char ch = 0;
printf("请输入一个英文:");
scanf("%c",&ch);
printf("%c\n",CASE(ch));
return 0;
}
#endif