zl程序教程

您现在的位置是:首页 >  其他

当前栏目

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

输入输出 字符串 格式化
2023-09-27 14:29:24 时间

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

主要介绍两个输入\输出函数:printf()和scanf()。
简要介绍一个重要工具------C预处理器指令。

字符串简介

字符串是一个或多个字符的序列。如:
“This is a string.”
双引号不是字符串的一部分。双引号仅告知编译器他括起来的是字符串。

char 类型数组和null字符

C语言没有专门用于存储字符串的变量类型,字符串都被存储在char类型数组中,数组由连续的存储单元组成。
在这里插入图片描述C语言用’\0’ 来标记字符串的结束。空字符不是数字0,它是非打印字符,其ASCII码值等价于0。
数组:可以把数组看成是一行连续的多个存储单元。更正是说法是,数组是同类型元素的有序序列。如:
ar后的方括号表明这是·一个数组,5表示该数组的元素数量。char表示每个元素的类型
使用字符串

#include<stdio.h>
#define PRAISE "You are an extraordinary being."
int main(void)
{
	char name[40];

	printf("What's your name? ");
	scanf_s("%s", name, 40);
	printf("Hello, %s. %s\n", name, PRAISE);
	return 0;
}

运行结果
在这里插入图片描述
scanf()只读取了Shi,它遇到第一个空白(空格, 制表符或换行符)时就不再读取输入。
一般而言,根据%s转换说明, scanf()只会读取字符串中的一个单词,而不是一整句。

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

常量和C预处理器

有时, 在程序中要使用常量。如计算圆的周长:
C = 3.14159 * d;
3.14159代表常量pi。 这种情况使用符号常量会更好。
假设程序中的多处使用一个常量, 有时需要改变它的值,若使用符号常量, 则只需改动符号常量的定义,不用逐一更改。
如何使用:
#define PI 3.14159
编译程序时,程序中所有的PI都被替换成3.14159.这一过程被称为编译时替换。 通常,这样的定义的常量也成为明示常量。

const 限定符
C90标准新增了const 关键字,用于限定一个变量为只读
如:const int MONTHS = 12;
这使得MONTHS在使用时只能打印MONTHS,但不能更改。

明示常量

C头文件limits.h和float.h中分别提供了整数类型和浮点类型大小限制相关的详细信息。每个头文件都提供了一系列明示常量。如:limits.h中包含类似代码:
#define INT_MAX +32767
#define INT_MIN -32767

limits.h中的一些明示常量

明示常量含义
CHAR_BITchar类型的位数
CHAR_MAXchar类型的最大值
CHAR_MINchar类型的最小值
SCHAR_MAXsigned char类型的最大值

printf()和scanf()

printf()和scanf()函数能让用户与程序交流。

printf()函数

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

                转换说明及其打印的输出结果
转换说明输出
%a/ %A浮点数,十六进制数和p计数法
%c单个字符
%d有符号十进制整数
%e / %E浮点数, e计数法
%f浮点数,十进制计数法
%g /%G根据值的不同,自动选择%f或%e。%e格式用于指数小于-4或者大于或等于精度时
%i有符号十进制整数(与%d相同)
%o无符号八进制整数
%p指针
%s字符串
%u无符号十进制整数
%x/%X无符号十六进制整数,使用十六进制数0f(0F)
%%打印一个百分号

使用printf()

如:
printf(“The %d contestants atr %f berry pies.\n”, number, pies);
注意
格式字符串中的转换说明一定要与后面的每一项相匹配。

printf()的转换说明修饰符
在%和转换字符之间加入修饰符可修饰基本的转换说明。

          printf()的一些修饰符
修饰符含义
标记可以不使用标记或使用多个标记,示例:"%-10d"
数字最小字段宽度 ,如果该字段不能容纳待打印的数字或字符串,系统会使用更宽的字段。示例:"%4d"
精度
对于%e,%E和%f转换,表示小数点右边数字的位数
.数字
对于%s转换,表示待打印字符的最大数量
对于整型转换,表示待打印数字的最小位数
h和整型转换说明一起使用, 表示short int 或unsigned short int 类型的值。示例:"%hu", “%hx”, “%6.4hd”
l和整型转换说明一起使用,表示long int 或unsigned long int 类型的值。示例:"%ld","%8lu"
z表示size_t类型的值。size_t是sizeof返回的类型。示例:"%zd","%12zd"
   printf()中的一些标记
标记含义
-待打印项左对齐。即从字段的最左侧开始打印该项
+有符号值若为正, 则在值前面显示加号;若为负,则在值前面显示减号。示例:"%+6.2f"
#把结果转换为另一种形式。如果是%o格式,则以0开始;如果是%x或%X格式,则以0x或0X开始;对于所有的浮点格式,#保证了即使后面没有任何数字,也打印一个小数点字符。对于%g和%G格式,#防止结果后面的0被删除。示例:"%#o","%#8.0f","%+#10.3e"
0对于数值格式,用前导0代替空格填充字段宽度。

转换说明的意义
转换可能会误导读者认为原始值被替换成转换后的值。实际上,转换说明是翻译说明,%d的意思是”把给定的值翻译成十进制整数文本并打印出来“。

转换不匹配
示例:如果把一个大于255的值转换为字符,例如当printf()使用%c打印365时,他只会看存储365的的最后一字节。这种截断相当于用一个整数除以256,保留其余数。该数字被解释成”以256为模“。
在这里插入图片描述只截取一字节即后八位。

printf()的返回值
printf()的返回值是打印字符的个数。如果打印错误,会返回一个负值

#include<stdio.h>
int main(void)
{
	int len;
	len = printf("Today is 2021.7.4.\n");
	printf("The printf() printed %d characters.\n", len);
	return 0;
}

输出结果
在这里插入图片描述
打印较长的字符串时

给字符串断行有三种方法:

  1. 使用多个printf()语句
  2. ()和Enter组合。这使得光标移至下一行,而且字符串中不会包含换行符。
  3. 在两个用双引号括起来的字符串之间用空白隔开。
#include<stdio.h>
int main(void)
{
   printf("Here is one way to print a");
   printf("long string.\n");
   printf("Here is another way to print a\
long string.\n");
   printf("Here is the newest way to print a"
   	"long string.\n");

   return 0;
}

在这里插入图片描述

使用scanf()

scanf()和printf()类似,主要区别是:printf()使用变量,常量和表达式,而scanf()函数使用指向变量的指针。

  • 如果用scanf()读取基本变量类型的值,在变量前加上一个&;
  • 如果用scanf()把字符读入字符数组中,不要用&。

scanf()的返回值
scanf()返回成功读取的项数。如果没有读取任何项,且需要读取一个数字而用户却输入一个非数字字符串, scanf()便会返回0。当scanf()检测到文件结尾时,会返回EOF(#define指令把EOF定义为-1)。

小结

  • 字符串是一系列被视为一个处理单元的字符。在C语言中,字符串是以空字符结尾的一系列字符。
  • 字符串常量是用双引号括起来的字符序列。
  • C预处理器为预处理器指令查找源代码程序。#define指令可以创建明示常量,即代表常量的符号。
  • 。。。