取决于在scanf中使用还是在printf中使用。
但占位符不限于%s,还是%g,%d,%lf,%c等等。
在scanf中使用,则添加了 * 的部分会被忽略,不会被参数获取。
比如 %*d 就是读一个 %d 该读的东西,但不赋值给任何变量。
int index_t = 1;
scanf("%*d", &index_t);
printf("%d", index_t);
//无论你怎么输入 获得的值都为1
int index_t = 1;
scanf("%d", &index_t);
printf("%d", index_t);
//无论你怎么输入 获得的值都是你输入的值
int a, b;
char b[10];
scanf("%d%*s",&a,b);
/**
* 输入为:12 abc
* 那么12将会读取到变量a中,但是后面的abc将在读取之后抛弃,
* 不赋予任何变量(例如这里的字符数组b)
*/
printf格式字符串中,与宽度控制和精度控制有关的常量都可以换成变量,方法就是使用一个 * 代替那个常量,然后在后面提供参数给 * ,以实现动态格式输出。
* 在 . 前面面,表示输出的总宽度,具体的数据来自参数表
如果参数 小于 字符串长度 ,则按照 原字符串 输出;
如果参数 大于 字符串长度,则按照 参数的长度 输出, 不足的在字符串左边补空格。
char s[] = "ABC";
printf("%*s", 10, s);
/**
* 意思是输出字符串s,但至少占10个位置,不足的在字符串s左边补空格,
* 这里等同于printf("%10s", s);
*/
在 . 后面,表示输出的字符个数,具体的数据来自参数表*
如果参数 小于 字符串长度 ,则按照 参数的长度 输出;
如果参数 大于 字符串长度,则按照 字符串实际长度 输出。
char s[] = "ABCD";
printf("%.*s\n", 2, s);
printf("%.*s\n", 10, s);
/**
* 输出结果为:
* AB
* ADCD
*/
此外,如果是浮点型,%.*lf,还可以控制输出精度。
double a = 3.14;
printf("%.*lf\n", 2, a);
printf("%.*lf\n", 5, a);
/**
* 输出结果为:
* 3.14
* 3.14000
*/
综上,. 前面定义输出总宽度,后面定义输出字符个数。
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
char *s = "this is test example";
int a, b;
printf("%.*s\n", 10, s); //这里的常量10就是给*号的,控制输出字符,也可以用一个变量来控制
printf("%*.*s\n", 20, 10, s); //常量20控制输出所占位宽,也可以用一个变量控制
cin >> a >> b; //输入15 10
printf("%*.*s\n", a, b, s); //输出为:-----this is te 前面定义输出总宽度,后面定义输出字符个数
cin.get();
cin.ignore(); //暂停程序执行
}
/**
* 输出结果为:( -代表空格)
* this is te //输出10个字符
* ----------this is te //输出10个字符,总宽度为20
* 15 10 //输入
* -----this is te //输出10个字符,总宽度为15
*