一.2C语言数据类型和变量(2)

文章详细介绍了C语言中的单目操作符(++,--,+,-)的使用,以及printf和scanf函数的格式控制,包括占位符、宽度、小数位数的设定,以及如何处理输入输出的格式化和类型转换。
摘要由CSDN通过智能技术生成

7.单目操作符++,--,+,-

#include<stdio.h>

int main()

{

        int a=5;

        int b=a++;

        printf("%d\n",a);

        return 0;

}

后置++:a++先使用,在加1
前置++:++a先加1,在使用

--与++的使用方法一样

7.2 +和-
这里的+和-是正负号都是单目操作符

#include<stdio.h>

int main()
{
    int a = -10;
    printf("%d\n", a);
    printf("%d\n", +a);
    return 0;
}

8.强制类型转换(类型)
直接写出的字面浮点数,会被编译器直接识别为double
int main()
{
    3.14;
    3.24f;
    int a =(int) 3.14;
    printf("%d\n", a);
    return 0;
}

9.scanf和printf介绍
9.1printf:print-打印  f-format-格式
printf 不会在末尾自动换行需要在输出末尾加\n

#include<stdio.h>
int main()
{
    printf("hello \nword");
    printf("hello");
    printf("\n");
    printf("word");
    return 0;
}

9.1.2占位符(第一个字符一律为%)
printf()可以在输出文本中指定的占位符,所谓占位符,就是这个位置可以用其他值代入。
int main()
{

    printf("there are 3 apples\n");
    printf("there are %d apples\n",3);
    return 0;
}


%d 是一种占位符,表示的10进制的有符号的整型
%s--字符串
int main()
{
    printf("zhangsan will come to night\n");
    printf("%s will come to night\n", "zhangsan");
    printf("%s will come to night\n", "lisi");
    return 0;
}


int main()
{
    printf("%s says it is %d o'clock","wangwu",20);
    return 0;
}


printf()参数与占位符是一一对应关系,如果有n个占位符,printf()的参数就有n+1个

9.1.3占位符列举
printf() 的占位符有许多种类,与 C 语⾔的数据类型相对应。下⾯按照字⺟顺序,
列出常⽤的占位符,⽅便查找,具体含义在后⾯章节介绍。
 % a :⼗六进制浮点数,字⺟输出为⼩写。
 % A :⼗六进制浮点数,字⺟输出为⼤写。
 % c :字符。
 % d :⼗进制整数。//int
 % e :使⽤科学计数法的浮点数,指数部分的 e 为⼩写。
 % E :使⽤科学计数法的浮点数,指数部分的 E 为⼤写。
 % i :整数,基本等同于 % d 。
 % f :⼩数(包含 float 类型和 double 类型)。//float-%f  double-%lf
 % g :6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的e为⼩写。
 % G :等同于 % g ,唯⼀的区别是指数部分的 E 为⼤写。
 % hd :⼗进制 short int 类型。//
 % ho :⼋进制 short int 类型。
 % hx :⼗六进制 short int 类型。
 % hu :unsigned short int 类型。//
 % ld :⼗进制 long int 类型。//
 % lo :⼋进制 long int 类型。
 % lx :⼗六进制 long int 类型。
 % lu :unsigned long int 类型。//
 % lld :⼗进制 long long int 类型。
 % llo :⼋进制 long long int 类型。
 % llx :⼗六进制 long long int 类型。
 % llu :unsigned long long int 类型。
 % Le :科学计数法表⽰的 long double 类型浮点数。
 % Lf :long double 类型浮点数。//
 % n :已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
 % o :⼋进制整数。
 % p :指针。//(用来打印地址)
 % s :字符串。//
 % u :⽆符号整数(unsigned int)。//
 % x :⼗六进制整数。//
 % zd : size_t 类型。//
 % %:输出⼀个百分号。
int main()
{
    int a = -10;
    printf("%d\n", a);
    printf("%u\n", a);
    return 0;
}


size_t 是无符号的整型类型

9.1.4输出格式
9.1.4.1限制宽度
printf()允许限定占位符的最小宽度
int main()
{
    printf("%d\n", 123);
    printf("%5d\n", 123);//右对齐,左边补空格,%5d表示这个占位符的宽度至少为5位
    printf("%5d\n", 1234567);
    printf("%-5d", 123);//左对齐
    printf("%d", 123);
    return 0;
}

int main()
{
    printf("%f\n", 123.45);
    printf("%12f\n", 123.45);
    return 0;
}


9.1.4.2总是显示正负号
int main()
{
    printf("%d\n", 12);
    printf("%d\n", -12);
    return 0;
}


9.1.4.3限制小数位数
希望小数点后保留2位,%.2分f
int main()
{
    printf("%f\n", 123.45);//123.450000
    printf("%.2f\n", 123.45);//123.45
    return 0;
}


与限制宽度占位符结合起来
int main()
{
    printf("%f\n", 0.5);
    printf("%.2f\n", 0.5);
    printf("%6.2f\n", 0.5);
    return 0;
}


最小宽度和小数点这两个限定和值,都可以用*代替,通过printf()的参数传入、
int main()
{
    printf("*.*f\n", 6,2,0.5);
    return 0;
}

9.1.4.4输出部分字符
%s占位符用来输出字符
int main()
{
    printf("hello word\n");
    printf("%s","hello word\n");
    printf("%.3s", "hello word\n");//hel
    return 0;
}

9.2scanf(输入)
int main()
{
    int score = 0;//输入一个成绩
    printf("请输入成绩:");
    scanf("%d", &score);//&取地址符号
    printf("成绩是%d\n", score);
    return 0;
}


9.2.1基本用法
scanf()用于读取用户键盘输入。程序运行到这个语句是时,会停下来,等待用户从键盘
输入,用户输入数据,按下回车键后,scanf()就会处理用户的输入,将其存入变量
它的原型定义在头文件stdio.h
scanf("%d", &i);
它的第⼀个参数是⼀个格式字符串,⾥⾯会放置占位符(与 printf()的占位符基本⼀致)
告诉编译器如何解读⽤⼾的输⼊,需要提取的数据是什么类型。
这是因为 C 语⾔的数据都是有类型的, scanf() 必须提前知道⽤⼾输⼊的数据类型,
才能处理数据。
它的其余参数就是存放⽤⼾输⼊的变量,格式字符串⾥⾯有多少个占位符,就有多少个
变量。上⾯⽰例中, scanf() 的第⼀个参数% d ,表⽰⽤⼾输⼊的应该是⼀个整数。% d
就是⼀个占位符,% 是占位符的标志, d 表⽰整数。第⼆个参数& i 表⽰,将⽤⼾从键
盘输⼊的整数存⼊变量i 。
注意:变量前⾯必须加上& 运算符(指针变量除外),因为 scanf() 传递的不是值,
⽽是地址,即将变量 i 的地址指向⽤⼾输⼊的值。
如果这⾥的变量是指针变量(⽐如字符串变量),那就不⽤加& 运算符。
int main()
{
    int i = 0;
    int j = 0;
    float x = 0.0f;
    float y = 0.0f;
    scanf("%d%d%f%f", &i,&j,&x,&y);
    printf("i=%d\n", i);
    printf("j=%d\n", j);
    printf("x=%f\n", x);
    printf("y=%f\n", y);
    return 0;
}


scanf ()处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等
scanf ()处理用户输入的原理是,用户的输入先放入缓存,等按下回车键后,按照占位符对缓存进行解读。
解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止
int main()
{
    int x;
    float y;//用户输入"    -13.45e12# 0"
    scanf("%d", &x);
    printf("%d\n", x);
    scanf("%f", &y);           
    printf("%f\n", y); //-13  449999994880.000000
    return 0;
}


9.2.2scanf的返回值
scanf()的返回值是一个函数,表示成功读取的变量个数
如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或
者遇到读取到⽂件结尾,则返回常量 EOF(-1)。
int main()
{
    int a = 0;
    int b = 0;
    float f = 0.0f;
    int ret=scanf("%d %d %f", &a, &b, &f);//接受scanf的返回值
    printf("ret=%d\n", ret);
    printf("a=%d\n", a);
    printf("b=%d\n", b);
    printf("f=%d\n", f);
    return 0;

}


scanf的返回值的理解很有用,在oj的刷题中,有多组输入场景的时候,可能会用到
oJ-online jugde在线判断
网页上写代码,网页上提交,判断结果是否正确(牛客题目)
9.2.3占位符
sacnf()常用的占位符如下,与printf()的占位符基本一致
%c %d  %f %lf %s 
%[]:在⽅括号中指定⼀组匹配的字符(⽐如 % [0 - 9] ),遇到不在集合之中的字符,匹配将会
停⽌。
上⾯所有占位符之中,除了 % c 以外,都会⾃动忽略起⾸的空⽩字符。 % c 不忽略空⽩字符,总是返
回当前第⼀个字符,⽆论该字符是否为空格。
int main()
{
    int a = 0;
    float b = 0.0f;
    scanf("%d %f\n", &a, &b);
    printf("%d %f\n", a, b);
}
int main()
{
    char c1 = 0;
    char c2 = 0;
    char c3 = 0;
    scanf("%c%c%c", &c1, &c2, &c3);
    printf("%c %c %c", c1, c2, c3);//abc-->a b c
    return 0;                      // abc-->  a b
}                                //a b c-->a   b


如果要强制跳过字符前的空⽩字符,可以写成 scanf(" %c", &ch) ,即% c 前加上⼀个空格,表
⽰跳过零个或多个空⽩字符。
下⾯要特别说⼀下占位符% s ,它其实不能简单地等同于字符串。它的规则是,从当前第⼀个⾮空⽩
字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌。
int main()
{
    char arr[20] = { 0 };
    scanf("%s", arr);//这里没有写&arr,因为数组名arr就是地址
    return 0;
}
因为% s 不会包含空⽩字符,所以⽆法⽤来读取多个单词,除⾮多个% s ⼀起使⽤。这也意味着,
scanf() 不适合读取可能包含空格的字符串,⽐如书名或歌曲名。另外, scanf() 遇到% s 占位
符,会在字符串变量末尾存储⼀个空字符 \0 。
int main()
{
    char arr1[20] = "xxxxxxxxxxxxxxxxxxxx";
    char arr2[20] = "xxxxxxxxxxxxxxxxxxxx";
    scanf("%s %s", arr1, arr2);
    printf("%s %s\n", arr1, arr2);
    return 0;
}
scanf() 将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度。所以,储存字符串时,
很可能会超过数组的边界,导致预想不到的结果。为了防⽌这种情况,使⽤ % s 占位符时,应该指定
读⼊字符串的最⻓⻓度,即写成 % [m]s ,其中的[m] 是⼀个整数,表⽰读取字符串的最⼤⻓度,后
⾯的字符将被丢弃。
int main()
{
    char arr[5] = {0};
    scanf("%4s", arr);
    printf("%s\n", arr);    //abcdefg
    return 0;               //abcd
}


9.2.4赋值忽略符
int main()
{
    int year = 0;
    int month = 0;
    int day = 0;
    scanf("%d-%d-%d", &year, &month, &day);//2024-1-20/2024 1 20/2024/1/20
    printf("%d-%d-%d\n", year, month, day);//2024-1-20/2024-0-0 /2024-1-20
    return 0;
}


为了避免这种情况, scanf() 提供了⼀个赋值忽略符(assignment suppression 
character)* 。只要把* 加在任何占位符的百分号后⾯,该占位符就不会返回值,
解析后将被丢弃。
int main()
{
    int year = 0;
    int month = 0;
    int day = 0;
    scanf("%d%*c%d%*c%d", &year, &month, &day);//2024/1/20
    printf("%d-%d-%d\n", year, month, day);   //2024-1-20
    return 0;
}


上⾯⽰例中,%* c 就是在占位符的百分号后⾯,加⼊了赋值忽略符* ,表⽰这个占位
符没有对应的变量,解读后不必返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值