C语言学习之路

C语言学习之路

1. C语言优缺点

  • 强大的控制结构
  • 快速
  • 代码紧凑
  • 程序更小
  • 可移植性
    C语言具有汇编具有的微调控能力,控制底层硬件。
    常见于:操作系统,计算机游戏,嵌入式系统,机器人工厂,电影,PC应用,计算机语言。

计算机组成:运算器 + 控制器 + (内存 +外存) + 输入设备 + 输出设备

高级语言:以一种更加可读的方式书写代码指令。
不同CPU需要不同的编译器,需要使用与特定CPU型号匹配的编译器。

2.C99标准

(1) 支持国际化编程
(2)调整现有实践致力于解决明显的缺陷
(3)适应科学和工程项目中的关键数值计算,提高C的适应性;

解释型语言:CPU执行过程中边解释边执行;
编译型语言:编译完成后统一执行;

编程步骤:
(1)定义程序目标
(2)设计程序
(3)编写代码
(4)编译
(5)运行程序
(6)测试和调试程序
(7)维护和修改程序

编译器:将源代码转换成中间代码
链接器:把中间代码和其他代码合并,生成可执行文件;将编写的目标代码,系统的标准启动代码和库代码这三部份合并成一个可执行文件。对于库代码,链接器仅将用到的库函数提取出来;

中间文件:即将源代码转换为机器语言代码,并将结果放在目标代码文件中;目标代码确缺失启动代码,启动代码充当着程序和操作系统之间的接口。且目标代码还缺少库函数。

3.集成开发环境

先下载CFree获取编译环境,再下载Clion用于日常实际开发;
C-Free
CLion

4.第一个C程序

输入字符串按规则截取
读取列标号
4 9 12 20 -1
abcdefghijklmnopqrstuvwxyz

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "iostream"

#define MAX_COLS 20
#define MAX_INPUT 1000

int read_column_numbers(int columns[], int max);

void rearrange(char *output, char const *input, int n_columns, int const columns[]);

int **read_columns();

char *arrange(int *columns, char *input);

int main() {

    int n_columns;
    int columns[MAX_COLS];
    char input[MAX_INPUT];
    char output[MAX_INPUT];
#if 0
    cou;
#endif
//    n_columns = read_column_numbers(columns, MAX_COLS);
    int **input_columns_pair = read_columns();
    /*
     * 读取列标号
     * 4 9 12 20 -1
     * abcdefghijklmnopqrstuvwxyz
     */

    while (gets(input) != nullptr && stricmp("exit", input) != 0) {
        //二维数组的长度 = 总长度/某一列的长度
        //要求为n*m的二维数组,空的部分不是nullptr
        int len_i = sizeof(*input_columns_pair) / sizeof((*input_columns_pair)[0]);
        printf("Original input: %s\n", input);
        char *tmp = nullptr;
        for (int i = 0; i < len_i; ++i) {
            char *o = arrange(input_columns_pair[i], input);
            if (tmp == nullptr) {
                tmp = o;
            } else if (o != nullptr) {
                strcat(tmp, o);
            }
//        rearrange(output, input, n_columns, columns);
        }
        printf("Rearrange line: %s\n", tmp);
    }
    return EXIT_SUCCESS;
}

//要求输入的截取段的列的数量n 符合 2*n < 1000
int **read_columns() {
    int num = 0;
    int *tmp = new int[MAX_INPUT];
    while (num < MAX_INPUT && scanf("%d", &tmp[num]) && tmp[num] != -1) {
        num++;
    }
    // 若输入的数字数量为奇数,舍弃最后一个输入
    //    定义二维数组
    int z = 0;
    int **ret = (int **) malloc(sizeof(int *) * (num / 2));
    memset(ret, 0, sizeof(int *) * (num / 2));
    for (int i = 0; i < num / 2; i++) {
        // 以2个数字为一组
        ret[i] = (int *) malloc(sizeof(int) * 2);
        memset(ret[i], 0, sizeof(int) * 2);
        ret[i][0] = tmp[z++];
        ret[i][1] = tmp[z++];
    }
    //    刷新缓冲区
    char ch;
    while ((ch = getchar()) != EOF && ch != '\n');
    return ret;
}

char *arrange(int *columns, char *input) {
    int len = strlen(input);
    int left = columns[0];
    int right = columns[1] > len ? len : columns[1];
    if (left >= len || left >= right) {
        return nullptr;
    }
    int size = right - left + 1;
    char *output = (char *) malloc(sizeof(char) * (size + 1));
//    char output[size + 1];
    strncpy(output, input + left, size);
    output[size] = '\0';
    return output;
}

int read_column_numbers(int columns[], int max) {
    int num = 0;
    int ch;
    while (num < max && scanf("%d", &columns[num]) && columns[num] >= 0) {
        num += 1;
    }

    if (num % 2 != 0) {
        puts("last column number is not paired!");
        exit(EXIT_FAILURE);
    }
//    刷新字符缓冲区
    while ((ch = getchar()) != EOF && ch != '\n');
    return num;
}

//将指定的字符连接在一起,输出以NUL结尾
void rearrange(char *output, char const *input, int n_columns, int const columns[]) {
    int col;
    int output_col;
    int len;
    len = strlen(input);
    output_col = 0;
    for (col = 0; col < n_columns; col += 2) {
        int nchars = columns[col + 1] - columns[col] + 1;
        if (columns[col] >= len || output_col == MAX_INPUT - 1) {
            break;
        }
        if (output_col + nchars > MAX_INPUT - 1) {
            nchars = MAX_INPUT - output_col - 1;
        }
        strncpy(output + output_col, input + columns[col], nchars);
        output_col += nchars;
    }
    output[output_col] = '\0';
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值