C语言常见问题代码验证

//------------------------------------------------使用 !='\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

(4)
witersen的头像witersen
上一篇 2021年9月11日 下午10:09
下一篇 2021年12月2日 下午5:43

相关推荐

发表回复

登录后才能评论