//------------------------------------------------使用 !='\0' 和 !=0 进行判断字符串是否结束的效果一样
#include <stdio.h>
#include <string.h>
int main()
{
char s2[] = "ilovechina";
for (int i = 0; s2[i] != '\0'; i++)//方式1
{
printf("%c", s2[i]);
}
printf("\n");
for (int i = 0; s2[i] != 0; i++)//方式2
{
printf("%c", s2[i]);
}
}
//------------------------------------------------全局变量和局部变量
#include <stdio.h>
int main()
{
int i = 2;
{
int i = 3;
printf("%d\n", i); //3
}
printf("%d\n", i); //2
}
//------------------------------------------------sizeof与strlen
#include <stdio.h>
#include <string.h>
int main()
{
char s[] = "\ta\017bc";
printf("%d\n", sizeof(s)); //6 因为系统自动为字符串加上的 \0 也被计算
printf("%d\n", strlen(s)); //5
}
//------------------------------------------------sizeof与strlen
#include <stdio.h>
#include <string.h>
int main()
{
char p[] = "abcde\0fghjik\0\0";
p[2] = '\0'; //效果和下一句一样 都代表终止符号
p[2] = 0; //效果和上一句一样 都代表终止符号
p[2] = '0'; //不代表终止符号 只是代表给某个位置的字符赋值
printf("%d\n", strlen(p)); //5
printf("%d\n", sizeof(p)); //15 sizeof不可算指针指向的字符串所占用的空间 sizeof计算的字符串中可包含\0
printf("%s\n", p); //ab0de
}
//------------------------------------------------sizeof与strlen
#include <stdio.h>
#include <string.h>
int main()
{
char s1[3] = {"ab"};
char s2[] = {"abc"};
char s3[3] = {"abc"};
printf("%d\n", sizeof(s1)); //3
printf("%d\n", sizeof(s2)); //4
printf("%d\n", sizeof(s3)); //3
printf("%d\n", strlen(s1)); //2
printf("%d\n", strlen(s2)); //3
printf("%d\n", strlen(s3)); //6 因为strlen的计算规则以找到 \0 作为结束的标志 所以结果不确定
}
//------------------------------------------------sizeof是一个操作符号 不是一个函数
#include <stdio.h>
int main()
{
int a = 2;
printf("%d\n", sizeof a); //4 正确
printf("%d\n", sizeof(a)); //4 正确
printf("%d\n", sizeof int); //语法错误
printf("%d\n", sizeof(int)); //4 正确
}
//------------------------------------------------sizeof易错点
#include <stdio.h>
int main()
{
int a[] = {0, 1, 2, 3, 4};
int b[3];
printf("%d\n", sizeof(a)); //20
printf("%d\n", sizeof(b)); //12
printf("%d\n", sizeof(a) / sizeof(int)); //5
printf("%d\n", sizeof(b) / sizeof(int)); //3
}
//------------------------------------------------字节对齐
#include <stdio.h>
int main()
{
typedef struct
{
char a[9];
double x;
} TY;
printf("%d\n", sizeof(TY)); //24
}
//------------------------------------------------字节对齐
#include <stdio.h>
int main()
{
struct bk1
{
int bno;
char bname[20];
char field[10];
char author[10];
char publisher[30];
float price;
} bk1;
printf("%d\n", sizeof(bk1)); //80
struct bk2
{
int bno;
char bname[20];
char field[10];
char author[10];
char publisher[30];
double price;
} bk2;
printf("%d\n", sizeof(bk2)); //88
struct A
{
char a;
double b;
int c;
} a;
printf("%d\n", sizeof(a)); //24
struct B
{
double b;
char a;
int c;
} b;
printf("%d\n", sizeof(b)); //16
struct C
{
int c;
char a;
double b;
} c;
printf("%d\n", sizeof(c)); //16
struct D
{
char a;
int c;
double b;
} d;
printf("%d\n", sizeof(d)); //16
}
//------------------------------------------------字符串指针和字符串数组名赋值
#include <stdio.h>
int main()
{
char s[] = "\ta\017bc";
char *p = s;
s = "abc"; //错误写法 语法错误 数组地址为一个值 不能作为可被赋值的左值
p = "youi"; //正确写法
printf("%s\n", s);
}
//------------------------------------------------传参数时出现多个自增的变量
#include <stdio.h>
void fun4(int a, int b, int c, int d, int e)
{
printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);
}
void fun3(int a, int b, int c, int d)
{
printf("a=%d b=%d c=%d d=%d\n", a, b, c, d);
}
void fun2(int a, int b, int c)
{
printf("a=%d b=%d c=%d\n", a, b, c);
}
void fun1(int a, int b)
{
printf("a=%d b=%d\n", a, b);
}
int main()
{
int a = 1, b = 1, c = 1, d = 1;
fun1(a, a++); //1 2 1
fun2(b, b++, b); //2 1 2
fun3(c, c++, c, c++); //3 2 3 1
fun4(d++, d++, d++, d++, d++); //3 2 31
}
//------------------------------------------------题型同上
#include <stdio.h>
int main()
{
int k = 3;
printf("%d\n", ++k + k); //8
printf("%d\n\n", k);//4
k = 3;
printf("%d\n", ++k + (k++)); //9
printf("%d\n\n", k);//5
k = 3;
printf("%d\n", (k++) + k); //7
printf("%d\n\n", k);//4
k = 3;
printf("%d\n", k + (++k)); //8
printf("%d\n\n", k);//4
}
//------------------------------------------------题型同上
#include <stdio.h>
int main()
{
int i = 5, j = 5, p, q;
p = (i++) + (i++) + (i++); //18
q = (++j) + (++j) + (++j); //22
printf("p=%d q=%d j=%d", p, q, j);//18 22 8
}
//------------------------------------------------嵌套switch容易忽略break
#include <stdio.h>
int main()
{
int a = 1, b = 0;
switch (a)
{
case 1:
switch (b)
{
case 0:
printf("0");
break;
case 1:
printf("1");
break;
}
//break; //注意这里的break是关键 不加则输出 02 加break则输出 0
case 2:
printf("2");
break;
}
}
//------------------------------------------------输入字符串中的结束符号 注意输出是没有空格的
#include <stdio.h>
int main()
{
char ch[3][4] = {"123", "456", "78"};
int i;
for (i = 0; i < 3; i++)
printf("%s\n", ch[i]); //输出结果为12345678 而不是 123 456 78 因为包含结束符号
}
//------------------------------------------------字符指针直接赋值
#include <stdio.h>
int main()
{
char *s; //错误写法 没有指向开辟的空间 野指针
char *s = (char *)malloc(100); //正确写法
scanf("%s", s);
printf("%s\n", s);
}
//------------------------------------------------共用体 未掌握
#include <stdio.h>
int main()
{
union dt
{
int a;
char b;
double c;
} data;
data.a = 5;
printf("%f\n", data.c); //0.000000
}
//------------------------------------------------共用体 未掌握
#include <stdio.h>
int main()
{
union
{
char i[4];
int k;
} r;
r.i[0] = 2;
r.i[1] = 0;
r.i[2] = 0;
r.i[3] = 0;
printf("%d\n", r.k); //2
}
//------------------------------------------------共用体 未掌握
#include <stdio.h>
int main()
{
union dt
{
int a;
char b;
double c;
} data;
data.a = 5;
printf("%f\n", data.b); //0.000000
printf("%f\n", data.c); //0.000000
printf("%d\n", data.b); //5
printf("%d\n", data.c); //5
}
//------------------------------------------------自增的自己给自己赋值
#include <stdio.h>
int main()
{
int a = 12;
a = a + (a -= a * a);
printf("%d", a); //-264
}
//------------------------------------------------字符与数字运算
#include <stdio.h>
int main()
{
//数字字符转数字
printf("%d\n", '1'); //49
printf("%d\n", '1' - 48); //1
printf("%d\n", '2'); //50
printf("%d\n", '2' - 48); //2
//大写转小写
printf("%c\n", 'A' + 32); //a
//小写转大写
printf("%c\n", 'a' - 32); //A
}
//------------------------------------------------输入字符串的两种方式
#include <stdio.h>
int main()
{
//两个代码块的先后顺序不同 结果不同 思考为什么
//gets 方式
char str2[20];
gets(str2);
printf("%s\n", str2);
//scanf 方式
char str1[20];
scanf("%s", str1);
printf("%s\n", str1);
}
//------------------------------------------------枚举类型的初始化赋值
#include <stdio.h>
int main()
{
enum week1
{
sun1,
mon1,
tue1 = 3,
wed1,
thu1,
fri1,
sat1
} w1;
printf("sun: %d\n", sun1); //0
printf("mon: %d\n", mon1); //1
printf("tue: %d\n", tue1); //3
printf("wed: %d\n", wed1); //4
printf("thu: %d\n", thu1); //5
printf("fri: %d\n", fri1); //6
printf("sat: %d\n\n", sat1); //7
enum week2
{
sun2,
mon2,
tue2 = 1,
wed2,
thu2,
fri2,
sat2
} w2;
printf("sun: %d\n", sun2); //0
printf("mon: %d\n", mon2); //1
printf("tue: %d\n", tue2); //1
printf("wed: %d\n", wed2); //2
printf("thu: %d\n", thu2); //3
printf("fri: %d\n", fri2); //4
printf("sat: %d\n", sat2); //5
}
//------------------------------------------------printf的奇技淫巧
#include <stdio.h>
int main()
{
int a = 1, b = 2, c = 3, d = 4, e = 5, f = 6, result;
printf("ABC""XYZ"); //ABCXYZ
printf("ABC""XYZ""EF"); //ABCXYZEF
}
//------------------------------------------------指针数组与指向数组的指针 重要
#include <stdio.h>
int main()
{
int a[4][3] = {1, 2, 3, 4, 5, 6};
int(*p)[3];
p = a; //对 p指向二维数组的0行
printf("%d\n", *(*(p + 1) + 1)); //5
p = &a[0]; //对 p指向二维数组的0行
printf("%d\n", *(*(p + 1) + 1)); //5
p = &a; //不对 这样写表示p指向整个二维数组
printf("%d\n", *(*(p + 1) + 1)); //
p = &(a[0][0]); //不对 指向的是二维数组的单个元素
printf("%d\n", *(*(p + 1) + 1)); //
}
//------------------------------------------------统计一段话的英文字母数和空格 注意输入终止方式
#include <stdio.h>
int main()
{
int english_a=0, english_A=0, figure=0, space=0, other=0;
char input;
//while ((input = getchar()) != '#') //方式一 输入指定字符 #
while ((input = getchar()) != EOF)//方式二 输入 CTRL + Z 来终止输入
{
if (input >= 'A' && input <= 'Z')
english_A++;
else if (input >= 'a' && input <= 'z')
english_a++;
else if (input >= '0' && input <= '9')
figure++;
else if (input == ' ')
space++;
else
other++;
}
printf("english_A=%d, english_a=%d, figure=%d, space=%d, other=%d", english_A, english_a, figure, space, other);
}
//------------------------------------------------字符串和文件操作
//设在文件a.txt和b.txt中分别存储两个字符串 将这两个字符串交叉合并并写入a.txt
//如 aaaaa 与 bbb 得到 abababaa 写入a.txt
//如 bbb 与 aaaaa 得到 bababaaa 写入a.txt
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp, *fq, *fr;
char ch;
if ((fp = fopen("a.txt", "r+")) == NULL) //a.txt打开方式为:读/写打开
exit(0);
if ((fq = fopen("b.txt", "r")) == NULL) //b.txt打开方式为:只读打开
exit(0);
fr = fopen("c.txt", "w+"); //c.txt打开方式为:读/写建立一个新的文件
while ((ch = fgetc(fp)) != EOF)
{
fputc(ch, fr); //从a.txt中取字符存入c.txt中
if ((ch = fgetc(fq)) != EOF) //同时从b.txt中取字符存入c.txt
{
fputc(ch, fr);
} //若不再执行if,表明b.txt字符串长度较a.txt中的短些
}
while ((ch = fgetc(fq)) != EOF) //若b.txt字符串比a.txt长
{
fputc(ch, fr);
}
rewind(fp); //将文件指针重新返回文件开头
rewind(fr);
while ((ch = getc(fr)) != EOF)
{
fputc(ch, fp);
}
fclose(fp);
fclose(fq);
fclose(fr);
}
原创文章,作者:witersen,如若转载,请注明出处:https://www.witersen.com