scanf()函数,字符输入输出函数,字符串处理函数

本文详细解释了C语言中的scanf函数及其在输入数值和字符时的使用技巧,包括格式控制字符串、空格处理、getchar和putchar函数以及字符串处理函数gets和fgets的区别。
摘要由CSDN通过智能技术生成

scanf(格式控制字符串,参数地址表)

格式控制字符串包括格式转换说明符(%+(格式修饰符)+格式字符)和分隔符

函数scanf()是从标准输入流stdin中读内容的子程序,由格式控制字符串按照格式转换说明符解析输入对应位置的信息,并存储于可变参数列表中对应的指针所指的位置。

.当scanf()返回EOF值(EOF在stdio.h中被定义为-1的宏常量),表示函数调用失败

.用函数scanf()输入数值型数据时,遇到如下情况被认为数据输入结束:

1.遇空格符,回车符,制表符(Tab);

2.达到输入域宽;

3.遇到非法字符输入。

注意

若格式控制字符串中无非格式字符,则认为所有输入的字符均为有效字符;

若格式控制字符串中有非格式字符,则输入数据中也应有这些字符。

①除了%c外,都会自动忽略起首的空白字符,%c不忽略空白字符,总是返回当前第一个字符

②占位符%s:从当前第一个非空白字符读起,直到遇到空白字符。由于%s不会包含空白字符,scanf()不适合用来读取含空格的字符串,scanf()遇到%s占位符,会在字符串变量末尾存储一个空字符'\0'

③在用%c格式读入字符时,空格字符和转义字符(包括回车符)都会被当做有效字符读入

%c格式符存在问题的解决办法:

1.scanf("  %c",&ch),即在%c前加上一个空格,表示跳过0个或多个空白字符(忽略前面输入时存入缓冲区中的回车符)

2.用函数getchar()将数据输入时存入缓冲区中的回车符读入,以避免被后面的字符型变量作为有效字符读入

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define N 30
typedef struct date
{
	int year;
	int month;
	int day;
}DATE;
typedef struct student
{
	long studentID;
	char studentname[N];
	char studentsex;
	DATE birthday;
	int score[4];
}STUDENT;
void inputscore(STUDENT stu[], int n, int m);
void averagescore(STUDENT stu[], float aver[], int n, int m);
void printscore(STUDENT stu[], float aver[], int n, int m);
int main()
{
	STUDENT stu[N];
	float aver[N];
	int n;
	printf("total students:\n");
	scanf("%d", &n);
	inputscore(stu, n, 4);
	averagescore(stu, aver, n, 4);
	printscore(stu, aver, n, 4);
	return 0;
}
void inputscore(STUDENT stu[], int n, int m)
{
	for (int i = 0; i < n; i++)
	{
		printf("input record %d\n", i + 1);
		scanf("%ld", &stu[i].studentID);
		scanf("%s", &stu[i].studentname);
		scanf(" %c", &stu[i].studentsex);//%c前有个空格,跳过空格
		scanf("%d", &stu[i].birthday.year);
		scanf("%d", &stu[i].birthday.month);
		scanf("%d", &stu[i].birthday.day);
		for (int j = 0; j < m; j++)
		{
			scanf("%d", &stu[i].score[j]);
		}
	}
}
void averagescore(STUDENT stu[], float aver[], int n, int m)
{
	int sum[N];
	for (int i = 0; i < n; i++)
	{
		sum[i] = 0;
		for (int j = 0; j < m; j++)
		{
			sum[i] += stu[i].score[j];
		}
		aver[i] = (float)sum[i] / m;
	}
}
void printscore(STUDENT stu[], float aver[], int n, int m)
{
	printf("results:\n");
	for (int i = 0; i < n; i++)
	{
		printf("%10ld%8s%3c%6d/%02d/%02d\n", stu[i].studentID, stu[i].studentname, stu[i].studentsex, stu[i].birthday.year, stu[i].birthday.month, stu[i].birthday.day);
		for (int j = 0; j < m; j++)
		{
			printf("%4d\t", stu[i].score[j]);
		}
		printf("%6.1f\n", aver[i]);
	}
}

此时的输入格式:

字符输入输出函数

getchar()和putchar()是C标准库中专门用于字符输入输出的函数

putchar():把一个字符输出到屏幕当前光标位置

getchar():回车(当用户键入回车后,getchar()才开始从标准输入流中读取字符))且回显到屏幕上,每次调用只读取一个字符(回车符也会被放到输入缓冲区)

getche():不用回车结束,回显;getch()不回车不回显

#include<stdio.h>
int main()
{
	char ch,sh,dh;
	ch = getchar();
	sh = getche();
	dh = getch();
	putchar(ch);
	putchar(sh);
	putchar(dh);
    return 0;
}

字符串处理函数

gets(参数) 可以读取空格(实现一整行字符串的输入),经常与puts(参数)配合使用

但是gets函数对输入的字符串没有大小限制,则有时候会出现字符串超出数组的大小,访问未曾定义的空间,则出现fgets(),fputs();

fputs(name,sizeof(name),stdout)

区别:gets()丢弃输入的换行符,puts()为输入添加换行符,fgets()存储输入的换行符,fputs()不为输出添加换行符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北茉疏影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值