赞
踩
当使用scanf_s函数时,我们知道,当它输入字符串时与gets()函数有区别,scanf_s遇到空格则结束读取,gets()则会把空格当作一个字符。比如scanf_s()和gets()同时读取字符串" I Love You"并输出,前者输出"I" ,后者输出" I Love You"。
当然这很明显,但是我在敲代码时又发现了其他问题。即用scanf_s函数同时输入输入多行字符串和数字时,会出错,比如我要输入三本图书的书名,价格,编号。用下面的代码则会出错
String name;
float price;
double adress;
for(i=0;i<3;i++)
{
scanf_s("%s %f %lf",name,&price ,&adress);
getchar();
}
上面的代码,当我们输入第一行并按回车键的时候,程序会直接结束运行。
继续进行更改:
for(i=0;i<3;i++)
{
scanf_s("%s\n%f \n%lf",name,&price ,&adress);
getchar();
}
还是不行。
继续更改:
for(i=0;i<3;i++)
{
scanf_s("%s", b[i].name);
scanf_s("%f", &b[i].price);
scanf_s("%lf", &b[i].adress);
getchar();
} ,报错。
......,......,......,......,
直到我在输入字符串的scanf_s()函数后面添加了一个数来限制限制字符串长度,程序才回归正常。
经测试,只要在输入字符串的scanf_s()函数后面限制字符串长度的程序都可以正常运行,相反则不能运行。
代码测试如下:
#include<stdio.h>
typedef struct book {
char name[20]; //书名
float price; //书价
double adress; //书的编号(位置)
}Book;
Book b[3]; //声明三个结构体变量,代表三本书
int main()
{
int i;
for (i = 0;i < 3;i++) //循环三次,每次输入一本图书的信息
{
/************************正确案例***********/
//案例1:
scanf_s("%s", b[i].name,20);
scanf_s("%f", &b[i].price);
scanf_s("%lf", &b[i].adress);
getchar(); // (1)数据输入后换行。(2)或者数据之间空格,
// 每组数据换行。可以运行
//案例2:
/*scanf_s("%s\n%f\n%lf",b[i].name,20, & b[i].price, &b[i].adress);
getchar();*/
//案例3:
/*scanf_s("%s %f %lf", b[i].name, 20, &b[i].price, &b[i].adress);
getchar();*/ //每一个数据空格隔开,一组数据按换行键,也可以正常运行
//案例4:
/*scanf_s("%s%f%lf", b[i].name, 20, &b[i].price, &b[i].adress);
getchar();*/ //每输入一个字符串或数字都按换行,也可以正常运行
/**********************错误案例************************************/
/*scanf_s("%s", b[i].name);
scanf_s("%f", &b[i].price);
scanf_s("%lf", &b[i].adress);
getchar();*/ //输入字符串的scanf_s函数没有限定字符串长度
//出现问题,输入一行数据会直接退出
}
for (i = 0;i < 3;i++)
{
printf("%s %f %lf\n", b[i].name, b[i].price, b[i].adress); //输出输入的三本图书的信息
}
但我依然有诸多疑问,为什么scanf_s("%s %f %lf", b[i].name, 20, &b[i].price, &b[i].adress);可以正常运行,而scanf_s("%s %f %lf", b[i].name, &b[i].price, &b[i].adress);则输入一行后就直接结束运行。新手小白,欢迎大家指正。
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。