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

举报
周棋洛 发表于 2022/05/25 23:13:11 2022/05/25
1k+ 0 0
【摘要】 文章目录 字符串和格式化输入/输出字符串(What)char类型数组和null字符strlen()函数常量和C预处理器const常量明示常量整数常量浮点常量字符常量printf()&sca...

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


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

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

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

字符串(What)

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

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

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


char类型数组和null字符

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

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

在这里插入图片描述

这个数组末尾的字符 \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;
}

  
 

在这里插入图片描述

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

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


字符和字符串

在这里插入图片描述

字符串常量"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;
}

  
 

在这里插入图片描述

在这里插入图片描述

常量和C预处理器

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

⚪的周长=Πd

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

  
 

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

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

  1. 常量名比数字表达的信息更多
  2. 假设程序多处使用一个常量,有时需要修改它的值.如果使用符号常量,只需要修改符号常量的值,反之,想想都头疼

如何创建符号常量?

方法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()函数打印数据的指令要与待打印数据的类型相匹配.

下面是格式转换说明

在这里插入图片描述

在这里插入图片描述

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;

}

  
 

在这里插入图片描述

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

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

  
 

在这里插入图片描述

#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;
}

  
 

在这里插入图片描述

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; 
}

  
 

在这里插入图片描述

说明:

  • 1、&a、&b、&c 中的 & 是地址运算符,分别获得这三个变量的内存地址。
  • 2、%d%d%d 是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格、tab 键、回车键分隔。

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


在这里插入图片描述


你仔细想想,你和谁在一起的时候最没有负担,最放得开,最自然,最舒服,最幸福,最简单,那才是你心里最重要的人。所以,那个人是我吗,宝。

文章来源: blog.csdn.net,作者:周棋洛ყ ᥱ ᥉,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/m0_53321320/article/details/118118250

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。