本文继续学习I/O函数,并延续前文的编号。
(三)、sscanf() 函数
sscanf() 函数与scanf() 有些相似,不同之处sscanf() 是从已有的字符串里面获取数据;这个函数也是定义在stdio.h中。
功能:处理已经输入到计算机中的字符串,从其中提取有用的数据
格式:sscanf(参1,参2,参3)
参1 字符串指针变量或字符串常量
参2 占位符字符串(指出从参1中解析出什么数据)
参3 接收变量地址
返回值:解析字符串成功,返回值是成功赋值的变量个数,如果解析失败,没解析出内容返回0,如果解析的是"\n"或"\0"或空格等则返回-1。
说明:
a.函数sscanf 在解析字符串时,需要占位字符串中的占位符类型、个数与接收变量的一致;占位符字符串中的间隔符号与源字符串中的间隔符号也要匹配。
b.函数sscanf 的数据来源是储存在变量中的,所以可以反复使用,一次不能解析出来可以二次解析,甚至多次完成;这点不同于scanf 是流数据,过去就完了。
c.函数sscanf 在使用时和scanf 一样,系统也会报警该函数不够安全导致不能编译,如想取消报警,可在程序头部添加语句:#define _CRT_SECURE_NO_WARNINGS。
(四)、getchar() 函数
这个函数我们一直在用,以往使用它的目的是为了阻塞程序的运行,使我们能够看到程序运行的结果(打回车结束程序)。实际上这个函数是用于键盘输入的函数,每调用一次getchar,函数就从键盘读入一个字符。getchar函数定义在头文件 stdio.h中。
功能:获得键盘输入的一个字符
使用格式:getchar(); //无参
返回值:正常接收输入的字符应当是用char类型变量接收;但读取失败时,返回的值是-1,因此处理异常时接收返回值应使用int型;也就是先用int型过滤一下,看是不是-1,如不是则可用char类型接收。
说明:
a.函数getchar从键盘读取字符时如直接按回车键相当于输入非显示字符"\n"。
b.如果输入空格,空格也会作为字符被读入,这一点不同于scanf,需注意。
c.函数getchar读入的都是字符,如果想转变为其它类型,则需要sscanf函数解析;而scanf可以直接输入其它类型数据。
d.由于每个中文字符需要一个以上字节表示,所以仅执行一次getchar函数无法输入中文,如输入中文需要进行循环。
(五)、putchar 函数
函数putchar可以将单个字符输出到屏幕,效果与使用printf 输出一个字符相同;这个函数也定义在头文件stdio.h中。
功能:将作为函数参数的单个字符输出到屏幕
格式:putchar('a');
返回值:成功返回参数字符,不成功返回-1
说明:
a.函数getchar与putchar均是对单个字符的操作,相比较scanf与printf速度来的快。
(六)、puts函数
函数puts可以把字符串显示在屏幕上,并且自动在字符串末尾添加换行符;puts函数定义在头文件 stdio.h中 。
功能:将作为参数的字符串显示到屏幕上
格式:puts(参1); //参1 字符串指针变量或字符串常量
返回值:成功返回非负整数,失败返回-1
(七)、下面将本文涉及的几个函数放到一个小程序中,用例子加深理解。
cpp
#define _CRT_SECURE_NO_WARNINGS //禁止对sscanf函数报警
#include<stdio.h>
int main(void)
{
//使用sscanf函数解析年月日字符串
char str[] = "2024年8月12日"; //中文习惯的日期字符串
int x, y, z;
int ret=sscanf(str, "%d年%d月%d日", &x, &y, &z);
printf("年=%d\n", x); //运行结果:年=2024
printf("月=%d\n", y); //运行结果:月=8
printf("日=%d\n", z); //运行结果:日=12
printf("ret=%d\n", ret); //运行结果:ret=3 (说明成功给三个变量解析到值)
//使用getchar函数输入数据
int i = 0;
int getChar;
char str1[128] = {0};
printf("请输入:\n");
while ((getChar = getchar()) != '\n') //输入12345回车结束
{
if (getChar == -1) break;
str1[i] = (char)getChar;
i++;
}
printf("str1=%s\n",str1);//运行结果:str1=12345
//使用putchar显示字符
char str2[] = "abcdefghijklmn";
i = 0;
while (str2[i] != '\0')
{
putchar(str2[i]); //运行结果:abcdefghijklmn
i++;
}
//使用puts显示字符串
puts(str2); //可以看到puts的显示是紧跟在putchar显示内容的后边,说明putchar不提供自动换行
puts(str2); //puts第二次显示是另起一行的,说明puts显示字符串是自动加换行符的
getchar();
return 0;
}