当前位置: 首页 > 工具软件 > S#arp Darc > 使用案例 >

%*s ,%.s ,%.*.s详解

庄飞
2023-12-01

取决于在scanf中使用还是在printf中使用。

但占位符不限于%s,还是%g,%d,%lf,%c等等。

(1)在scanf中使用

在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)
 */

(2) 在printf中使用

printf格式字符串中,与宽度控制和精度控制有关的常量都可以换成变量,方法就是使用一个 * 代替那个常量,然后在后面提供参数给 * ,以实现动态格式输出。

①  %*s

* 在 . 前面面,表示输出的总宽度,具体的数据来自参数表

如果参数 小于 字符串长度 ,则按照 原字符串 输出;

如果参数 大于 字符串长度,则按照 参数的长度 输出, 不足的在字符串左边补空格。

char s[] = "ABC";
printf("%*s", 10, s);
/** 
 * 意思是输出字符串s,但至少占10个位置,不足的在字符串s左边补空格,
 * 这里等同于printf("%10s", s);
 */

 

②  %.*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
 */ 

③%*.*s

综上,. 前面定义输出总宽度,后面定义输出字符个数。

#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
 * 

学习于:https://zhidao.baidu.com/question/166904879.html

              https://www.cnblogs.com/ph829/p/5576832.html       

 类似资料: