C 文件读写 fopen fscanf fgets

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stddef.h>
#include <time.h>

int main() {
    // 文件读写
    FILE *fp = NULL;
    char buff[256];

    fp = fopen("D://c//cts//mini//bin//Debug//test.txt", "w+");
    fprintf(fp, "test fprintf\n");
    fputs("test fputs\n", fp);
    fclose(fp);

    fp = fopen("D://c//cts//mini//bin//Debug//test.txt", "rt+");
    // fscanf(fp, "%s", buff); 在读取一行数据时,如何遇到该行数据有空格,那么读到空格处就停止,不再继续向下读。
    //fscanf(fp, "%s", buff);
    // fscanf(fp, "%[^\n]%*c", buff); 遇到空格继续读取,读取完整的一行数据。
    /*
    格式控制说明:%[ ]表示读取指定字符集的文本,例如%[0-9]表示仅读取数字,遇到非数字字符就停止;%[a-zA-Z]表示读取字符,遇到非字母字符就停止)。
    第一个字符是'^',表示反向读取,读取指定字符集以外的文本,遇到指定字符集就停止。
    *表示忽略读取的字符,就是说读取指定的字符但不保存到变量中。
    %[^\n]表示读取'\n'之外的所有字符;之后的%*c表示忽略读取的'\n',就是说读取'\n'但不保存。
    %*[^\n]%*c表示跳过一行。
    */
    fscanf(fp, "%[^\n]%*c", buff);
    printf("1: %s\n", buff);

    fgets(buff, 256, (FILE*)fp);
    printf("2: %s\n", buff);

    fclose(fp);
}

C 内存管理

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stddef.h>
#include <time.h>

int main() {
    // 内存管理
    char name[50];
    char *desc;

    strcpy(name, "jiangzhihao");

    //calloc(200, sizeof(char));
    //在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。
    //所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。

    //malloc(30 * sizeof(char))
    //在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。

    // 动态分配内存
    desc = (char *)malloc(30 * sizeof(char));
    if (desc == NULL) {
        fprintf(stderr, "Error - unable to allocate required memory\n");
    } else {
        strcpy(desc, "chanpinxue.cn");
    }
    // 假设要存储更大的描述信息
    desc = realloc(desc, 50 * sizeof(char));
    if (desc == NULL) {
        fprintf(stderr, "Error - unable to allocate required memory\n");
    } else {
        strcat(desc, "\twelcome to chanpinxue.cn");
    }

    printf("Name = %s\n", name);
    printf("Desc: %s\n", desc);

    // 使用 free() 函数释放内存
    free(desc);
}

C 输出国际象棋棋盘

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stddef.h>
#include <time.h>

int main()
{
    // 国际象棋棋盘由64个黑白相间的格子组成,分为8行*8列。
    // 用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。
    int i, j;
    for (i = 0; i < 8; i++)
    {
        for (j = 0; j < 8; j++)
        {
            if ( (i+j)%2 == 0)
            {
                printf("%c%c", 0xa8, 0x80);
            }
            else
            {
                printf("  ");
            }
        }
        printf("\n");
    }
}
阅读全文

C 日期时间 time 年月日小时分秒

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stddef.h>
#include <time.h>

int main()
{
    struct tm *t;
    time_t tt;
    time(&tt);
    t = localtime(&tt);
    printf("%4d-%02d-%02d %02d:%02d:%02d\n", t->tm_year+1900, t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);

    //printf("Hello world!\n");
    return 0;
}

C enum 枚举

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stddef.h>
#include <time.h>

int main()
{
    // 枚举
    enum boss {a, b, c};
    enum boss bo;
    // 对枚举变量bo进行赋予元素操作
    bo = a;
    switch(bo)
    {
        case a:
            printf("boss的值是a\n");
            break;
        case b:
            printf("boss的值是b\n");
            break;
        case c:
            printf("boss的值是c\n");
            break;
    }
}

C 可变参数 va_list va_start va_end

va_list是在C语言中解决可变参数问题的一组宏,在头文件<stdarg.h>下。
va_list的用法:
1、首先在函数里定义一个va_list型的valist变量,这个变量是指向参数的指针。
2、然后用va_start初始化valist变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数。
3、然后用va_arg返回可变的参数,va_arg的第二个参数是需要返回的参数的类型。
4、最后用va_end结束可变参数的获取。

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

// 函数声明
int sum_more(int num, ...);

int main()
{
    int k;
    // 计算num个数字的和,
    k = sum_more(3, 3, 4, 5);
    printf("k = %d", k);

    return 0;
}

// 加法
int sum_more(int num, ...)
{
    va_list valist;
    int i;
    int total = 0;

    // 为 num 个参数初始化 valist
    va_start(valist, num);

    // 访问所有赋给 valist 的参数
    for (i = 0; i &lt; num; i++)
    {
       total += va_arg(valist, int);
    }
    // 清理为 valist 保留的内存
    va_end(valist);
    return total;
}
阅读全文

C 指针

#include <stdio.h>
#include <stdlib.h>

int main()
{
    // 指针初始化时,“=”的右操作数必须为内存中数据的地址,不能够是变量,也不能够直接用整型地址值
    // *p仅仅是表示定义的是个指针变量,并没有间接取值的意思。
    int count = 9;
    int *order_count;
    // 在指针变量中存储 count 的地址
    order_count = &count;
    // 在指针变量中存储的地址
    printf("%p\n", order_count);

    // 使用指针访问值
    printf("%d\n", *order_count);

    //printf("Hello world!\n");
    return 0;
}