计算机二级之C语言程序设计知识重点和注意事项(一)

文章目录

1.char的输入输出方法总结

输入:

char name:name = getchar() name = getc(stdin) == scanf("%c", &name)
char name[]:gets(name) fgets(name,sizeof(name),stdin) == scanf("%s", name)

输出:

char name:putchar(name) putc(name, stdout)
char name[]:printf

2.各种数据类型比较的返回值特点

字符串比较strcmp/strncmp: str1 > str2,返回值 > 0 ; str1 < str2,返回值 < 0 ; str1 == str2,返回值 = 0;
其他数据类型比较:
C89:(len = a>b)结果为“真”,len = 1;结果为“假”,len = 0
C99:(bool len = a>b)结果为"true",len = 1;结果为"fause", len = 0
数据类型比较通常放进条件语句

3.拷贝strcpy要将字符串的结束符也要拷贝进去。

char name_1[20]= "123456789012345";
char name_2[20]= "China";
strnpy(name_1,name_2);
printf("%s", name_1);

打印出来的name_1为“China”。
为了不把字符串结束符拷贝进去,可用strncpy代替strcpy

4.拷贝strncpy也会将字符串结束符拷贝进去

char str_1[10] = "123456789";
char str_2[5] = "abc";
strncpy(str_1,str_2,5);
printf("%s", str_1);
printf("%d, %d, %c, %c", str_1[4], str_1[5], str_1[6], str_1[7]);

输出结果为:
abc
0,0,6,7

5.拼接strcat和strcpy、strncpy一样都不用另作命名

char dest1[10];
char dest2[10];
gets(dest1);
fgets(dest2,10,stdin);
strcat(dest1,dest2);
printf("%s", dest1);

(假设输入dest1:四川 dest2:成都)
输出结果为:四川成都

5.字符串长度strlen不会把字符串结束符算作长度

char str1 = "Chengdu";
len = strlen(str1);
printf("%d", len);

输出的长度为7

6.输入单个字符getchar可以当做暂停用

char name;
name = getchar();
getchar();
printf("%c", name);

(假设输入John)
输入过后第一次敲击回车键,暂停,第二次敲击回车键,输出John

7.输入字符串gets可能会造成数据破坏

char name[5];
gets(name);
printf("%s", name);

(假设输入ChangHong)
“ChangHong”的字符长度大于5,会造成数据破坏。
为了避免数据破坏,可用fgets代替gets

8.输入字符串fgets要将回车符输入进去

char str2[8];
fgets(str2,sizeof(str2),stdin);
printf("[%s]", str2);

(假设输入的是Rock,在打完k后按下回车键)
输出的结果为:[Rock
]

9.比较字符串长度strcmp不能和fgets搭配

char name1[5] = "Rock";
char name2[5];
fgets(name2, 5, stdin)
if(strcmp(name1, name2) == 0)
printf("You are right!");

(假设输入Rock)
不会输出“You are right!”
为了避免,可用strncmp代替strcmp

10.比较字符串长度strncmp(name1,name2,strlen(name1));

char name1[5] = "Rock";
char name2[5];
int len;
fgets(name2, 5, stdin);
len = strncmp(name1, name2, strlen(name1));
printf("len = %d", len);

(假设输入Rock)
输出结果为“len = 0”

11.strcmp,strncmp通常放在if语句

if(strcmp(str1,str2) == 0){        //一定要跟上==0
}

==0,则为“真”,反之为“假”

11.其他数据类型比较经常用在条件语句

C89类型
int a,b;
scanf("%d%d", &a,&b);
if(a >b){
printf("a大于b");
}
if(a > < >= <= != == b){
}
C99类型
#include <stdbool.h>
int a,b;
	scanf("%d%d", &a, &b);
	bool len;
	len = a > b;
	if(len){
	printf("a大于b\n");
	}
	printf("len = %d\n",len);
	printf("len = %d\n",true);
	printf("len = %d",false);

(假设输入12 11)
输出结果:len = 1 len = 1 len = 0
(假设输入12 17)
输出结果:len = 0 len = 1 len = 0

12.逻辑与&&当第一个条件为“假”时不会判断第二个条件

int x = 10;
int a = 5;
int b;
scanf("%d", &b);
if(a > b && (x = 100) > 90){
printf("x = %d", x);
}
printf("x = %d", x);

if(( 1 ) && ( 2 )){
}
(假设输入4,a>b满足1)
输出x = 100
(假设输入6,a<b不满足1)
输出x = 10

尽量不要在( 2 )里面对某一变量再次赋值

13.逻辑或||当第一个条件为“真”时不会判断第二个条件

int x = 10;
int a = 5;
int b;
scanf("%d", &b);
if(a > b && (x = 100) > 90){
printf("x = %d", x);
}
printf("x = %d", x);

(假设输入4,a>b满足1)
输出为x = 10
(假设输入6,a<b不满足1)
输出为x = 100
总之在if(( 1 ) && ( 2 ))中不要在( 2 )里面对某一变量再次赋值

14.C语言条件语句中非零数都是“真”

int age;
printf("请输入年龄:");
scanf("%d",&age);
if(!age >= 30){        //!与age直接结合
printf("正太\n");
} printf("大叔");

(正确代码应该是if(!(age >= 30){)
age为非零数,则为“真”,!age则为“假”
为“假”,则为0
因此输出结果为“正太”

15.三目运算符与if语句的区别

if 语句:
int a;
int b = 10;
scanf("%d", a);
if(a>b){
b = 30;
}
b = 5;
三目运算符:
int a;
int b;
scanf("%d", a);
b = a>10 ? 30 : 5;

以上两种代码是一样的。if语句要输入a,b的数据;而三目运算符只需要输入a或b其中一个的数据

16.逗号运算符优先级最低

int len;
	len = (3+5,2*3,4/2);       //取最后一个表达式的值作为该“逗号表达式”的值
	printf("len = %d", len);

len = 4/2 = 2

int len;
	len = 3+5,2*3,4/2;        //先计算len = 3+5 再计算2*3
	printf("len = %d", len);

len = 3+5 = 8

17.算术运算的注意事项

(1)取余运算%只能char和int类型才可用
10 % 3;
//两个数均为int类型

结果为 1

(2)所有算术运算只能是同类型数据进行运算,因此会有隐式类型转换
算数转换:出现在条件语句中
if(
赋值转换
int len;           //为int类型
len = 3 * 1.2      //因此1.2也要转换为int类型,即为1
printf("%d", len);

输出len为3

强制类型转化:优先级较高
int x;
x = (char)123 + 15;   //将数字123强制转化为char类型照样能够运算

因为括号()的优先级最高,所以接下来是运算符优先级。

18.运算符优先级

x = !3 + 4 < 5 && 6 > 7 || 8 > 7

等效于

x =( (!3 + 4) < 5 && (6 > 7 ))|| (8 > 7)

括号() [] > ! > 算术运算符 > 关系运算符 > && > || > 赋值运算符 > 逗号运算符
其中括号的优先级为:括号越小越先

19.else if语句的格式要求

  if (salary >= 10000) {
		printf("牵手成功");
	} else if (printf("那你有房吗?\n") && scanf("%s", answer) &&
		strcmp(answer,"yes") == 0 ) {
		printf("可以考虑一下");
	} else if (printf("你有车吗?\n") && scanf("%s", answer) &&        //第二个“&&”放在末端
		strcmp(answer,"yes") == 0 ) {
		printf("可以考虑一下");
	} else{
		printf("你是个好人\n");
	}

	return 0;
	}                                    //所有的“}”都对齐

所有的大括号中间都要空行写代码,如:

{
代码
}

}之后空一格紧接else或else if

} else if
} else

if 要与所有的“}”对齐

if{

} else if

} else if

} else

}


总架构

if(       ){
   printf(    );
}  else if(      &&      &&
     ){
   printf(   );
}  else if(      &&      &&
     ){
   printf(   );
}  else{

}

20.数学区间“20 ≤a ≤60”转换为代码形式

if (a >= 20 && a <= 60)

21.else if(a >=(1) && a <= (2))的条件优化

优化前:

if (grades >= 0 && grades < 60){
	  printf("不及格\n");
	} else if(grades >= 60 && grades < 80){
	  printf("及格\n");
	} else if(grades >= 80 && grades < 90){
	  printf("良好\n");
	} else if(grades >= 90 && grades <= 100){
	  printf("优秀\n");
	} else{
	  printf("非法成绩\n");
	}
	  return 0;
}

else if(a >=(1) && a <= (2)),若不满足此条件,则默认a >= (2),因此不用在下一个else if中加上"else if(a >= (2) && a <=…)",直接来"else if(a <=…)"就可以了。

优化后:

if (grades < 0 || grades > 100){          //先剔除非法的输入方式
	  printf("非法成绩\n");
	} else if(grades < 60){
	  printf("不及格\n");
	} else if(grades < 80){               //默认grades >= 60了,直接来grades < 80
	  printf("及格\n");
	} else if(grades < 90){               //直接来grades < 90
	  printf("良好\n");
	} else if(grades <= 100){             //直接来grades <= 100
	  printf("优秀\n");
	}
	  return 0;
}

22.for(表达式1;表达式2;表达式3){

}

for(i = 0;i<n;i++){
printf("...%d...,i");
}

表达式1:赋值语句
表达式2:循环条件
表达式3:改变循环计数
若不知道循环次数,则用while语句;若已知循环次数,用for语句。

23.while语句中的如何知道循环次数

while(1){
   if(i==n){
   }
}

或者

while(i<n){
}

则已知循环次数

while(1){
   if(strcmp(name,"JHD") == 0 && strcmp(pwd,"123456") == 0){
   }
}

不知道循环次数

24.while语句

int i=0;       
while(1){
   if(i==n){   
   break;
   }
   else{
   printf("...%d...,i");
   Sleep(1000);
   i++;     
   }
 }
  printf("循环执行完后执行的语句");

在while语句中当不满足if语句时才执行else,若满足if语句则break出来,跳出while语句。
像上面这种完全可以先简化一下

int i=0;            
while(i<n){         
   printf("...%d...,i");
   Sleep(1000);
   i++;             
   }
}
 printf("循环执行完后执行的语句");

更可以被for循环替代

for(i=0;i<n;i++){
   printf("...%d...,i");
   Sleep(1000);
}
printf("循环执行完后执行的语句");

25.Sleep(1000);

Sleep是windows平台下的接口,表示每隔n毫秒执行一次循环体。1000毫秒==1秒
使用Sleep时,必须在头文件中著名#include<windows.h>

26.system("…")

system

27.do-while循环:do{

}while(i<n);

int i;
i = 0;
system("cls");
do{
	 printf("我吃%d个饺子\n",i);
	 i++;
	 Sleep(500);
  }while(i < 5);
printf("我吃饱了");

先执行一次do大括号中的循环体,再判断while括号中的条件。符合条件则返回再执行循环体。

28.编译器中输入-std=c99

当你的C语言使用的是C89版本却打出了C99版本的代码时,在编译的时候会报错。
此时只需要重新输入:gcc 文件名.c -std=c99
回车,就可

29.水平制表符\t

printf("...\t");

通常用在循环语句中,能够在水平上让每一列的循环体根据情况自动对齐。
在这里插入图片描述

30.几种代码的高级写法

1.字符串匹配成功if(!strcmp(str1,str2))

if(!strcmp(name,name1) && !strcmp(pwd,pwd1){
}

2.文件打开失败if(!file)

FILE *file;
file = fopen("......","r");
if(!flie){
}

3.文件读取完成if(!ret)

char line[123];
char *ret;
ret = fgets(line,sizeof(line),file);
if(!ret){
}

(!.. )== (…=0)

31.fopen打开文件的几种方式

1.“r” 以“读”的方式打开一个".txt"文件
2.“w"以“写”的方式创建一个新的”.txt"文件
3.“a"以“尾部追加”并且“写”的方式打开一个原先存在的”.txt"文件
除此之外,可以在上面三种后面分别接上"b"(二进制文件)"+"(边读边写)“b+”
注意:当以"w" "a"即以“写”的方式打开文件后,在写了过后必须接上fclose

32.打开两个文件的判断方式

当要用到“写”的代码,比如fputc,fputs,就要打开两个文件

file1 = fopen("hello.c","r");     
file2 = fopen("unix.txt","a");    
if(!file1 || !file2){             
	printf("文件打开失败");
	return 1;
}
fclose(file1);
fclose(file2);

33.边读边写的代码格式

1.fgetc与fputc搭配,读一个字符写一个字符直到读取结束

 while((c=fgetc(file1)) != EOF){  
	fputc(c,file2);
   }

2.fgets与fputs搭配,读一串字符写一串字符直到读取结束

while(fgets(line,sizeof(line),file1)){
	fputs(line,file2);
}

34.读取文件中单个字符c = fgetc(file)

fgetc只能与“读”的打开方式匹配,即"r"
如何读取整个文件的代码
代码1:

char c;
while(1){
	c = fgetc(file);
	printf("%c",c);
	if(c == EOF){
		break;
	}
}

代码2:

char c;
while((c = fgetc(file)) != EOF){
	printf("%c",c);
}

显然代码2更简洁
fgetc经常与fputc一起使用,即“先读取后写入”,不过要打开两个文件。

35.读取文件中的一行内容fgets(line,sizeof(line),file)

fgets只能与“读”的打开方式匹配,即"r"
如何读取整个文件的代码
代码1

while(1){
		ret = fgets(line,sizeof(line),file);
		if(!ret){
			break;
		}
		printf("%s",line);
	}

代码2

while(1){
		if(fgets(line,sizeof(line),file)){
		printf("%s",line);
	}

显然代码2更简洁

36.往文件中写入单个字符fputc(c,file2)

fputc只能与“写”的打开方式匹配,即"w" "a"
先“读”一个文件,再“写”入另一个文件,因此使用fputc要打开两个文件

FILE *file1;
FILE *file2;
char c;
file1 = fopen("hello.c","r");     //“读”一个文件
file2 = fopen("unix.txt","a");    //“写”入另一个文件
if(!file1 || !file2){             //判断两个文件是否打开成功的方式
	printf("文件打开失败");
	return 1;
}
   while((c=fgetc(file1)) != EOF){   //这是简洁的代码写法
	fputc(c,file2);
   }
fclose(file1);  
fclose(file2);                   //最后记得关闭文件
return 0;

往文件中“写”的如fputc,fputs在此之后必须要关闭文件fclose(file)才能真正写入内容

37.往文件中写入字符串fputs(line,file2)

while(fgets(line,sizeof(line),file1)){
	fputs(line,file2);
	printf("%s",line);
}
fclose(file1);
fclose(file2);
return 0;

38.往文件中写格式化数据fprintf(file,"…",str)

fprintf是在文件中输出数据而不是跟printf一样在cmd中输出数据

printf("请输入姓名");
scanf("%s",name);
printf("请输入年龄");
scanf("%d",&age);
while((c = getchar()) != '\n');   //清空输入缓冲区
fprintf(file,"%s\t\t %d\n",name,age);
fclose(file);

fprintf与scanf搭配,就像fgetc与fputc,fgets与fputs搭配一样

39.格式化读取文件中的数据fscanf

fscanf是从文件中输入数据而不是跟scanf一样从键盘中输入数据

while(fscanf(file2,"%s %d\n",name,&age) != EOF){
	printf("%s年龄为%d\n",name,age);
}

其实:fscanf(stdin,"%s %d\n",name,&age)scanf("%s %d\n",name,&age) 效果是一样的
注意:fscanf中" "里面的内容格式应该与文件内容一致例如:文件中的内容:姓名:王珊 年龄:21代码应该为:fscanf(file,"姓名:%s 年龄:%d",name,&age);

fscanf与printf搭配

40.往文件中写入二进制数据fwrite(str,sizeof(char),strlen(str),file)

输入二进制数据只能输入英文或汉字,输入数字或转变成乱码
当字符串初始化为char str[] ="......"

char str[] = "Hello Word!";
FILE *file;
file = fopen("url.txt","wb");   //注意加上b表示二进制
fwrite(str ,sizeof(char),strlen(str),file);
fclose(file);

当字符串初始化为char str[32];时,只需要注意输入字符串应该使用gets或者fgets就行

39.代码中输入次数与输出次数不相等的情况

1.scanf次数 < printf次数
结论:对于%c的scanf,要么scanf(" %c",…),要么在之前加上while((c = getchar()) != ‘\n’);

char name[12];
int age;
char c;
do{
	printf("请输入姓名");
	scanf("%s",name);
	printf("请输入年龄");
	scanf("%d",&age);
	fprintf(file,"%s\t\t %d\n",name,age);
	printf("还需要继续输入吗?Y/N\n");
	scanf("%c",&c);
} while(c == 'Y');

解决方法一:在第最后一个scanf中输入%c时在%c前面加上一个空格

char name[12];
int age;
char c;
do{
	printf("请输入姓名");
	scanf("%s",name);
	printf("请输入年龄");
	scanf("%d",&age);
	fprintf(file,"%s\t\t %d\n",name,age);
	fclose(file);
	printf("还需要继续输入吗?Y/N\n");
	scanf(" %c",&c);  //加空格
} while(c == 'Y');

解决方法二:清空输入缓冲区while((c = getchar()) != '\n'); fflush(stdin);

char name[12];
int age;
char c, d;
do{
	printf("请输入姓名");
	scanf("%s",name);
	printf("请输入年龄");
	scanf("%d",&age);
	while((c = getchar()) != '\n');   //清空输入缓冲区
	fprintf(file,"%s\t\t %d\n",name,age);
	fclose(file);
	printf("还需要继续输入吗?Y/N\n");
	scanf("%c",&d);  //没有空格
} while(d == 'Y');
char name[12];
int age;
char c;
do{
	printf("请输入姓名");
	scanf("%s",name);
	printf("请输入年龄");
	scanf("%d",&age);
	fflush(stdin);   //清空输入缓冲区
	fprintf(file,"%s\t\t %d\n",name,age);
	fclose(file);
	printf("还需要继续输入吗?Y/N\n");
	scanf("%c",&c);  //没有空格
} while(c == 'Y');

40.如何输出带" "的字符串

只需要加上转义字符\ " … \ "即可
往cmd中输出

printf("\"Chinese\"");

输出结果为"Chinese"

往文件中输出

FILE *file;
file = fopen("url.txt","w");
fprintf(file,"\"Chinese\"");
fclose(file);

输出结果为"Chinese"
输入的话像是scanf fscanf直接加上双引号""即可

scanf("%s",str);  //若输入"Chinese"
printf("%s",str);   //则输出"Chinese"

39.读取文件内容代码+步骤

while(fgets读取文件中一行的内容——>sscanf读取一行中的小内容)

while(1){                                         //读取文件内容的小循环
		ret = fgets(line,sizeof(line),file);      //fgets还可用来读取文件中的一行内容
		if(!ret){                                 //若文件已经读完,文件读完表示没找到内容,则fgets返回值为0
			break;
		}       
		sscanf(line,"%s %s",name_tmp,pwd_tmp);    //sscanf用在fgets之后,用来分割并读取一行内容里的多个小内容
		if(!strcmp(name,name_tmp) && !strcmp(pwd,pwd_tmp)){
			break;
		}
	}                                             //没读到内容,和用户名密码匹配成功,都跳出小循环
	if(ret){                                      //若文件没有读完,说明已经读到内容,则fgets返回值不是0
		break;                                    //跳出读取文件的大循环
	}

40.读取文件代码+步骤

while(fopen打开文件——>while(fgets读取文件中一行的内容——>sscanf读取一行中的小内容))
——>文件读取成功,文件内容读取成功,用户名密码匹配成功

char *ret;                                        //fgets的返回值,反应文件内容是否读完,即是否找到内容
char line[123];
char name_tmp[32];
char pwd_tmp[32];
while(1){                                         //读取文件的大循环
	file = fopen("......","r");                   //fopen打开文件
	if(!flie){
	return 1;                                     //若文件打开失败,直接结束代码
	}
	while(1){                                     //读取文件内容的小循环
		ret = fgets(line,sizeof(line),file);      //fgets还可用来读取文件中的一行内容
		if(!ret){                                 //若文件已经读完,文件读完表示没找到内容,则fgets返回值为0
			break;
		}       
		sscanf(line,"%s %s",name_tmp,pwd_tmp);    //sscanf用在fgets之后,用来分割并读取一行内容里的多个小内容
		if(!strcmp(name,name_tmp) && !strcmp(pwd,pwd_tmp)){
			break;
		}
	}                                             //没读到内容,或用户名密码匹配成功,跳出小循环
	if(ret){                                     
		break;   //若文件没有读完,说明已经读到内容,则fgets返回值不是0,此时表示文件读取成功,文件内容读取成功,用户名密码匹配成功,跳出大循环
	}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值