当前位置:   article > 正文

关于scanf_s函数同时输入字符串与数字报错的原因_scanf同时输入数字与字符出错

scanf同时输入数字与字符出错

当使用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);则输入一行后就直接结束运行。新手小白,欢迎大家指正。


}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码秘术家/article/detail/62747
推荐阅读
相关标签
  

闽ICP备14008679号