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()不为输出添加换行符