初学者 求解答C语言中printf

printf(“%d”,a) 和printf(“%d\n,"a)都可以吗

\n是换行符,如果你只有一个printf的输出语句其实问题不大,但如果有多条printf语句则会有明显差异,例如:
printf("12345"); 结果为:12345
printf("123\n");
printf("45"); 结果就是:
123
45

加一个\n没问题的

  • 这篇博客: C语言——学习笔记(全)中的 3.实现简版的printf函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 首先要创建目录:

    src —— 标准的工程项目开发的名字,里面存放源文件

    include —— 存放头文件

    bin —— 存放a.out

    lib —— 存放链接库的库文件
    请添加图片描述
    请添加图片描述

    makefile 【脚本语言(文本脚本/工具)类似于 markdown文档】:方便工程项目开发的多文件链接编译过程

    创建名为makefile的文件【touch makefile / touch MAKEFILE】(每次修改文件就重新编译相关的文件):

    .PHONY: clean #相当于在一个虚拟路径下创建了一个命令clean,即使当前目录下有名为clean的文件或目录,也不影响
    all: main.o ./src/print.o #最后一步需要依赖的文件
            gcc main.o ./src/print.o -o ./bin/a.out #最后一部执行的语句(将所有对象文件链接在一起生成可执行文件)
    main.o: main.c ./include/print.h #确定main.o的来源
            gcc -c main.c -I./include #生成main.o
    ./src/print.o: ./src/print.c ./include/print.h
            gcc -c ./src/print.c -I./include -o ./src/print.o #如果不加上-o后面的内容,就是生成在了和makefile相同的目录下
    run:  #直接执行可执行程序
            ./bin/a.out
    clean: #清空
            rm main.o
            rm ./src/print.o
            rm ./bin/a.out
    

    请添加图片描述

    简版printf函数实现:

    (1)include/print.h

    #ifndef _PRINT_H
    #define _PRINT_H
    
    int print(const char *format, ...);
    
    #endif
    

    (2)src/print.c

    #include <stdio.h>
    #include <stdarg.h>
    
    #define PUTC(a) putchar(a), ++cnt;
    
    int output(char *num, int n){
        int cnt = 0;
        for(int i = n - 1; i >= 0; i--){
            PUTC(num[i]);
        }
        return cnt;
    }
    
    int put_d(int n){
        char num[20] = {0};
        unsigned int x; //极小值比极大值多1,int直接存存不下
        int i = 0, cnt = 0;
        if(n < 0) { 
            x = -n, PUTC('-');
        }
        else x = n;
    
        do {
            num[i++] = x % 10 + '0'; //取整型的最后一位,然后转换成字符
            x /= 10;
        } while(x);
        return cnt += output(num, i);
    }
    
        do {
            num[i++] = x % 10 + '0'; //取整型的最后一位,然后转换成字符
            x /= 10;
        } while(x);
        return cnt += output(num, i);
    }
    
    int put_s(char *str){
        int cnt = 0;
        for(int i = 0; str[i]; i++){
            PUTC(str[i]);
        }
        return cnt;
    }
    
    int print(const char *format, ...){
        int cnt = 0;
        va_list arg;
        va_start(arg, format);
        for(int i = 0; format[i]; i++){
            //PUTC(format[i]);
            switch(format[i]){
                case '%':{
                    switch(format[++i]){
                        case '%': PUTC(format[i]); break;
                        case 'd': cnt += put_d(va_arg(arg, int)); break;
                        case 's': cnt += put_s(va_arg(arg, char *)); break;
                    }
                }
                break;
                default: PUTC(format[i]);
            }
        }
        va_end(arg);
        return cnt;
    }
    
    #undef PUCT
    

    (3)main.c

    #include<stdio.h>
    #include <inttypes.h>
    #include <print.h>
    
    int main(){
        int a = 123;
        printf("length = %d\n", printf("Hello world\t"));
        print("length = %d\n",print("Hello world\t"));
        printf("length = %d\n", printf("a = %d\t", a));
        print("length = %d\n", print("a = %d\t", a));
        printf("length = %d\n", printf("int(0) = %d\t", 0));
        print("length = %d\n", print("int(0) = %d\t", 0));
        printf("length = %d\n", printf("int(1000) = %d\t", 1000));
        print("length = %d\n", print("int(1000) = %d\t", 1000));
        printf("length = %d\n", printf("int(-123) = %d\t", -123));
        print("length = %d\n", print("int(-123) = %d\t", -123)); 
        printf("length = %d\n", printf("int(100500) = %d\t", 100500));
        print("length = %d\n", print("int(100500) = %d\t", 100500));
    
        printf("length = %d\n", printf("INT32_MAX = %d\t", INT32_MAX));
        print("length = %d\n", print("INT32_MAX = %d\t", INT32_MAX));
        printf("length = %d\n", printf("INT32_MIN = %d\t", INT32_MIN));
        print("length = %d\n", print("INT32_MIN = %d\t", INT32_MIN));
    
        char str[100] = "I love China!";
        printf("length = %d\n", printf("str = %s\t", str));
        print("length = %d\n", print("str = %s\t", str));
        printf("length = %d\n", printf("str = %s\t", "Hello World!"));
        print("length = %d\n", print("str = %s\t", "Hello World!"));
    
        return 0;
    }
    

    链接库

    ①动态链接库【xxx.so】

    ②静态链接库(重点)【xxx.a】

    要生成的静态链接库的名字规范:libxxx.a【前后缀必须是lib和.a】

    请添加图片描述

    要是对您有帮助,点个赞再走吧~ 欢迎评论区讨论~