printf(“%d”,a) 和printf(“%d\n,"a)都可以吗
\n是换行符,如果你只有一个printf的输出语句其实问题不大,但如果有多条printf语句则会有明显差异,例如:
printf("12345"); 结果为:12345
printf("123\n");
printf("45"); 结果就是:
123
45
加一个\n没问题的
首先要创建目录:
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】
要是对您有帮助,点个赞再走吧~ 欢迎评论区讨论~