前言:
我琢磨了好久,怎么把printf("The value of a is %d\n",a); 中的红字a,做到灵活替换呢?
这篇文章就是讨论如何把参数插入到字符串中
一、铺垫
首先我们来做一个小小的铺垫吧
int main()
{
printf("hello world\n");
printf("hello ""world\n");
return 0;
}
我们可以看到,这里的两种打印方法都打印出了同样的效果。
这样就能把a作为一个参数给printf传进去? 嘿嘿,然后我就开始了下面的整活
第一种:用函数来实现传参
1.我想把下面这些printf语句封装成一个函数,这样代码不就简单很多了嘛
int main()
{
int a = 2;
printf("The value of a is %d\n", a);int b = 5;
printf("The value of b is %d\n", b);float f = 5.2f;
printf("The value of f is %f\n", f);
return 0;
}
2.于是我写了下面一段代码,想用红色语句替代蓝色语句
void Printf(int a)
{
printf("The value of a is %d\n", a);
}
int main()
{
int a = 2;
//printf("The value of a is %d\n", a);
Printf(a);int b = 5;
//printf("The value of a is %d\n", b);
Printf(b);int f = 5.2;
//printf("The value of a is %d\n", f);
Printf(f);
return 0;
}
结果却成了这样。。。不仅仅字母没替换过去,连最后一个float类型的也给我打印成了int型
3.所以我放弃了函数,想着还有什么能够代替函数呢?
突然有一个闯入我的眼中 宏, 对呀,#define定义的宏也可以实现参数的替换
第二种:宏
1.其实宏不仅仅可以定义常量
酱紫用
#define M 100
2.还可以定义一段语句,一个类似于函数的东西
eg. #define MAX(x,y) ( ((x)>(y)) ? (x) : (y))
3.所以我想到了这么写
#define PRINTF(n) printf("The value of n is %d\n",n)
int main()
{
int a = 10;
PRINTF(a);
return 0;
}
好吧还是出了问题,这里的 n 还是 n , 试了这么多种方法,最开始我想实现的把 红字a 做到灵活的替换都还是没有实现
是不是还差点什么,我又从最开始去找,复查我的步骤
功夫不负有心人,其实我最开始那里的hello world 就是一个很好的开始,只是我走着走着就走偏了
它重新给了我一个灵感,是不是把红字a给写成一个单独的字符串就行了呢?
就是这个样子
printf("The value of " "a" " is %d\n", a);
这样就能把a作为一个参数给printf传进去?
但要想把字母a作为参数传进去,其实还需要引入一个小小的知识点
回到最初的问题 如何把参数插入到字符串中
其实用一个符号就可以解决的 那就是 #
#n 等价于 “n” ,这样就可以很好的把字符串插入到另一个字符串中啦。
所以我又改了一下上面的代码,红色描出的是改成功的,但是蓝色描出的部分又出了问题
#define PRINTF(n) printf("The value of "#n" is %d\n",n)
int main()
{
int a = 5;
PRINTF(a);
int b = 2;
PRINTF(b);
float f = 5.2;
PRINTF(f);
return 0;
}
上图就展现出了问题所在,没办法打印浮点数
所以针对 %d 我们还得再做出改变,现在就不仅仅只是对 红字a 的灵活更改了,还得对后面的%d 进行优化
其实也很容易,按照修改 a 的逻辑往上套就行了 %d 改为 “%d” 嘛
但是不能直接把 #%d 往上面直接套,这么多符号堆上去编译器吃得消嘛?
format 格式 就给 %d, %f 等等这些 赋值给变量format就行了
既然有两个变量,那就只能传两个参数咯
#define PRINTF(n,format) printf("The value of "#n" is "format"\n",n)
int main()
{
int a = 5;
PRINTF(a, "%d");
int b = 2;
PRINTF(b, "%d");
float f = 5.2;
PRINTF(f, "%f");
return 0;
}
哈哈哈哈哈,终于大功告成啦。