字符串和格式化输入输出(基础学习)

简介: 字符串和格式化输入输出(基础学习)

文章目录


字符串和格式化输入/输出


字符串(What)


char类型数组和null字符


strlen()函数


常量和C预处理器


const常量


明示常量


整数常量



浮点常量


字符常量


printf()&scanf()


printf打印函数


scanf输入函数


字符串和格式化输入/输出


主要学习输入输出。C语言的两个输入输出函数:printf()和scanf()。


学会使用这两个函数,不仅能实现与用户的交互,还可以根据个人喜好和任务要求格式化输出。


最后,一个重要的工具——C预处理指令,并学会如何定义及使用


字符串(What)


字符串是一个或多个字符的序列。


例如 字符串"Liusen is a handsome boy" 字符:‘a’


双引号不是字符串的一部分。双引号仅告诉编译器它括起来的是字符串,就好比单引号用来标识是一个字符是一个道理


char类型数组和null字符


C语言没有专门储存字符串的变量类型,字符串都被储存在char类型的数组里。


数组由连续的储存单元组成,字符串中的字符被储存在相邻的储存单元里,每个单元储存一个字符。


20210622213317286.png


这个数组末尾的字符 \0 .这是空字符,C语言用它来标记字符串的结束,它是转义字符,其ASCII码值是0


C中的字符串一定以空字符结束,也就是说数组的大小必须至少要比将要储存的字符串中的字符数多1


就好比一个大小为10的数组,它可以储存9个字符,剩下的一个留给空字符用来标识字符串已经结束


什么是数组


可以把数组看作是一行连续的多个储存单元,更准确说,数组是同类型数据元素的有序序列


使用字符串


新上映的 *<<你好世界>>*不知道大家看了没,哈哈,我好像高三就看完了😂


#include <stdio.h>
int main()
{
    char name[20];
    printf("请输入\n");
    scanf("%s",name);
    printf("Hello,%s!",name);
    return 0;
}

20210622213603776.png


%s告诉printf()打印一个字符串


scanf()在读取输入时就已经把空字符放在了字符串末尾


字符和字符串


20210622213658246.jpg


字符串常量"x"和字符常量’x’不同。区别之一在于’x’是基本类型(char),而"x"是派生类型(char数组);区别之二是"x"实际上由两个字符组成:'x’和空字符\0


strlen()函数



#include <string.h>
string.h头文件包含多个与字符串相关的函数原型,包括strlen().
#include <stdio.h>
#include <string.h>
#define HE "I am zhouqiluo"
int main()
{
    char name[40];
    printf("输入你的名字");
    scanf("%s",name);
    printf("Hello,%s %s\n",name,HE);
    printf( "strlen is %zd and sizeof is %zd",strlen(name),sizeof name);
    return 0;
}

20210622213754868.png

20210622213804687.png

常量和C预处理器


有时程序需要用到常量.比如计算⚪的周长


⚪的周长=Πd


int pi,sum;
pi=3;
sum=2*pi;


这叫符号常量,计算机会用实际值来完成替换


为什么使用符号常量更好?


常量名比数字表达的信息更多

假设程序多处使用一个常量,有时需要修改它的值.如果使用符号常量,只需要修改符号常量的值,反之,想想都头疼


如何创建符号常量?


方法1:先声明一个变量,然后将该变量设置为需要的常量


int sum;
sum=3;


这样写有个问题,就是num是一个变量,程序可能会无意间改变它的值.


方法2:C还提供了一个更好的方案------C预处理器


C预处理器


预处理器也可以用来定义常量.只需要在程序顶部添加一行:


#define SUM 3


编译程序时,程序中的所有的sum都会被替换成3.这个过程被称为 编译时替换


这样定义的常量也叫做 明示常量


格式:#define 符号常量名 符号常量值(其中没有等号)


尾部不用加分号


为什么要用大写?


用大写表示符号常量是C语言一贯的传统,看到大写就明白这是一个符号变量,而非变量.


这并不影响程序的正常运行,只是我们应该养成大写常量的好习惯.


命名规则


符号常量的命名规则和变量相同


可以使用大小写字母,数字和下划线字符,首字母不能是数字.


const常量


C90新增了关键字const,用于限定一个变量为只读


const int sum = 12;//sum的值在程序中不可更改,使sum成为了一个只读值.


明示常量


C头文件limits.h和float.h分别提供了与整数类型和浮点类型大小限制相关的详细信息。每个头文件都定义了一系列供实现使用的明示常量 例如,limits.h头文件包含以下类似的代码:


#define INT_MAX +32767

#define INT_MIN -32768


这些明示常量代表int类型可表示的最大值和最小值。如果系统使用32位的int,该头文件会为这些明示常量提供不同的值。如果在程序中包含limits.h头文件,就可编写下面的代码:


printf(“Maximum int value on this system = %d\n”, INT_MAX);


类似地,float.h头文件中也定义一些明示常量,如FLT_DIG和DBL_DIG,分别表示float类型和double类型的有效数字位数。


整数常量


整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。


整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。


212         /* 合法的 */
215u        /* 合法的 */
0xFeeL      /* 合法的 */
078         /* 非法的:8 不是八进制的数字 */
032UU       /* 非法的:不能重复后缀 */


85         /* 十进制 */
0213       /* 八进制 */
0x4b       /* 十六进制 */
30         /* 整数 */
30u        /* 无符号整数 */
30l        /* 长整数 */
30ul       /* 无符号长整数 */


浮点常量


浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。


当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。


下面列举几个浮点常量的实例:


3.14159       /* 合法的 */
314159E-5L    /* 合法的 */
510E          /* 非法的:不完整的指数 */
210f          /* 非法的:没有小数或指数 */
.e55          /* 非法的:缺少整数或分数 */


字符常量


字符常量是括在单引号中,例如,‘x’ 可以存储在 char 类型的简单变量中。


字符常量可以是一个普通的字符(例如 ‘x’)、一个转义序列(例如 ‘\t’),或一个通用的字符(例如 ‘\u02C0’)。


在 C 中,有一些特定的字符,当它们前面有反斜杠时,它们就具有特殊的含义,被用来表示如换行符(\n)或制表符(\t)等。下表列出了一些这样的转义序列码:


转义序列 含义


\ \ 字符

’ ’ 字符

" " 字符

? ? 字符

\a 警报铃声

\b 退格键

\f 换页符

\n 换行符

\r 回车

\t 水平制表符

\v 垂直制表符

\ooo 一到三位的八进制数

\xhh . . . 一个或多个数字的十六进制数


printf()&scanf()


这两个函数的使用能使程序更好的与用户交流,他们是输入/输出函数,简称I/O函数


printf打印函数


请求printf()函数打印数据的指令要与待打印数据的类型相匹配.


下面是格式转换说明


20210622213853231.png

20210622213916947.png

flags(标识) 描述


- 在给定的字段宽度内左对齐,默认是右对齐(参见 width 子说明符)。


+ 强制在结果之前显示加号或减号(+ 或 -),即正数前面会显示 + 号。默认情况下,只有负数前面会显示一个 - 号。


空格 如果没有写入任何符号,则在该值前面插入一个空格。


# 与 o、x 或 X 说明符一起使用时,非零值前面会分别显示 0、0x 或 0X。 与 e、E 和 f 一起使用时,会强制输出包含一个小数点,即使后边没有数字时也会显示小数点。默认情况下,如果后边没有数字时候,不会显示显示小数点。 与 g 或 G 一起使用时,结果与使用 e 或 E 时相同,但是尾部的零不会被移除。


0 在指定填充 padding 的数字左边放置零(0),而不是空格(参见 width 子说明符)。


width(宽度) 描述


(number) 要输出的字符的最小数目。如果输出的值短于该数,结果会用空格填充。如果输出的值长于该数,结果不会被截断。


* 宽度在 format 字符串中未指定,但是会作为附加整数值参数放置于要被格式化的参数之前。


.precision(精度) 描述


.number 对于整数说明符(d、i、o、u、x、X):precision 指定了要写入的数字的最小位数。如果写入的值短于该数,结果会用前导零来填充。如果写入的值长于该数,结果不会被截断。精度为 0 意味着不写入任何字符。 对于 e、E 和 f 说明符:要在小数点后输出的小数位数。 对于 g 和 G 说明符:要输出的最大有效位数。 对于 s: 要输出的最大字符数。默认情况下,所有字符都会被输出,直到遇到末尾的空字符。 对于 c 类型:没有任何影响。 当未指定任何精度时,默认为 1。如果指定时不带有一个显式值,则假定为 0。


.* 精度在 format 字符串中未指定,但是会作为附加整数值参数放置于要被格式化的参数之前。


length(长度) 描述


h 参数被解释为短整型或无符号短整型(仅适用于整数说明符:i、d、o、u、x 和 X)。


l 参数被解释为长整型或无符号长整型,适用于整数说明符(i、d、o、u、x 和 X)及说明符 c(表示一个宽字符)和 s(表示宽字符字符串)。


L 参数被解释为长双精度型(仅适用于浮点数说明符:e、E、f、g 和 G)。


实例


#include<stdio.h>
int main(){
  int a=8;
  printf("我的小孩小张%d岁了",a);
  return 0;
}

8.png


注意:格式字符串中的转换说明一定要与后面的每个项匹配


#include <stdio.h>
int main ()
{
   int ch;
   for( ch = 75 ; ch <= 80; ch++ ) {
      printf("ASCII 值 = %d, 字符 = %c\n", ch , ch );
   }
   return(0);
}

20210622214019943.png


#include <stdio.h>
int main()
{
   char ch = 'A';
   char str[20] = "www.runoob.com";
   float flt = 10.234;
   int no = 150;
   double dbl = 20.123456;
   printf("字符为 %c \n", ch);
   printf("字符串为 %s \n" , str);
   printf("浮点数为 %f \n", flt);
   printf("整数为 %d\n" , no);
   printf("双精度值为 %lf \n", dbl);
   printf("八进制值为 %o \n", no);
   printf("十六进制值为 %x \n", no);
   return 0;
}

20210622214041287.png


scanf输入函数


scanf 类型说明符:


类型 合格的输入 参数的类型


%a、%A 读入一个浮点值(仅 C99 有效)。 float *


%c 单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取


width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符。 char *


%d 十进制整数:数字前面的 + 或 - 号是可选的。 int *


%e、%E、%f、%F、%g、%G 浮点数:包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E,以及一个十进制数字。两个有效的实例 -732.103 和


7.12e4 float *


%i 读入十进制,八进制,十六进制整数 。 int *


%o 八进制整数。 int *


%s 字符串。这将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)。 char *


%u 无符号的十进制整数。 unsigned int *


%x、%X 十六进制整数。 int *


%p 读入一个指针 。


%[] 扫描字符集合 。


%% 读 % 符号。


#include<stdio.h>
int main(void) 
{ 
    int a,b,c; 
    printf("请输入三个数字:");
    scanf("%d%d%d",&a,&b,&c); 
    printf("%d,%d,%d\n",a,b,c);
    return 0; 
}

9.png


说明


1、&a、&b、&c 中的 & 是地址运算符,分别获得这三个变量的内存地址。


2、%d%d%d 是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格、tab 键、回车键分隔。


如果使用 , 来分隔输入的 %d, 相应的输入时也需要添加 ,:





相关文章
C4.
|
2月前
|
C语言
C语言数据的输入与输出
C语言数据的输入与输出
C4.
18 0
|
2天前
|
存储 C语言
C语言6 字符串输入和格式输入函数
C语言6 字符串输入和格式输入函数
6 0
|
1月前
|
存储 C语言 知识图谱
C primer plus 学习笔记 第4章 字符串和格式化输入/输出
C primer plus 学习笔记 第4章 字符串和格式化输入/输出
|
2月前
02-python的基础语法-标识符/运算符/字符串拓展/字符串的拼接/字符串格式化/字符串精度控制/字符串格式化方式2/对表达式进行格式化/练习题/数据输入-input语句
02-python的基础语法-标识符/运算符/字符串拓展/字符串的拼接/字符串格式化/字符串精度控制/字符串格式化方式2/对表达式进行格式化/练习题/数据输入-input语句
|
2月前
|
存储 C语言
C语言——数据输入和输出
C语言——数据输入和输出
23 0
|
2月前
|
C++
在C++语言中文件的输入输出
在C++语言中文件的输入输出
17 0
|
存储 C语言
C语言——字符串&&格式化输入输出(学习分享)
C语言——字符串&&格式化输入输出(学习分享)
98 0
|
存储 移动开发 Unix
【C语言】文件的输入与输出
【C语言】文件的输入与输出
|
存储 iOS开发 C++
C++格式输入输出
🐰C++格式输入输出 🏡用流对象的成员函数控制输入输出格式 🌸1.控制格式的标志位 🌸2.使用成员函数设置标志字 🌸3.使用成员函数设置域宽、填充字节、精度 🏡用控制符控制输入输出格式
|
存储 编译器 C语言
【C语言程序设计】C语言知识点汇总1——变量、运算符、格式化输入输出、函数
【C语言程序设计】C语言知识点汇总1——变量、运算符、格式化输入输出、函数
220 0
【C语言程序设计】C语言知识点汇总1——变量、运算符、格式化输入输出、函数