文章目录
- 1.char的输入输出方法总结
- 2.各种数据类型比较的返回值特点
- 3.拷贝strcpy要将字符串的结束符也要拷贝进去。
- 4.拷贝strncpy也会将字符串结束符拷贝进去
- 5.拼接strcat和strcpy、strncpy一样都不用另作命名
- 5.字符串长度strlen不会把字符串结束符算作长度
- 6.输入单个字符getchar可以当做暂停用
- 7.输入字符串gets可能会造成数据破坏
- 8.输入字符串fgets要将回车符输入进去
- 9.比较字符串长度strcmp不能和fgets搭配
- 10.比较字符串长度strncmp(name1,name2,strlen(name1));
- 11.strcmp,strncmp通常放在if语句
- 11.其他数据类型比较经常用在条件语句
- 12.逻辑与&&当第一个条件为“假”时不会判断第二个条件
- 13.逻辑或||当第一个条件为“真”时不会判断第二个条件
- 14.C语言条件语句中非零数都是“真”
- 15.三目运算符与if语句的区别
- 16.逗号运算符优先级最低
- 17.算术运算的注意事项
- 18.运算符优先级
- 19.else if语句的格式要求
- 20.数学区间“20 ≤a ≤60”转换为代码形式
- 21.else if(a >=(1) && a <= (2))的条件优化
- 22.for(表达式1;表达式2;表达式3){
- }
- 23.while语句中的如何知道循环次数
- 24.while语句
- 25.Sleep(1000);
- 26.system("...")
- 27.do-while循环:do{
- }while(i
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,此时表示文件读取成功,文件内容读取成功,用户名密码匹配成功,跳出大循环
}