【发布时间】:2016-05-06 00:23:50
【问题描述】:
在给定的代码中,fgets 不等待输入。
我尝试使用 scanf,但它给出了异常错误(在 0x0F74DDF4 (ucrtbased.dll) 处引发异常)。我正在使用 Visual Studio 2015 来调试我的代码。谁能解释为什么 fgets 不等待输入?
#include<stdio.h>
#include<stdlib.h>
#include<process.h>
//GLOBAL-VARIABLE DECLARTION
#define MAX 1000
//GLOBAL-STRUCTURES DECLARATION
struct census
{
char city[MAX];
long int p;
float l;
};
//GLOBAL-STRUCTURE-VARIABLE DECLARATION
struct census cen[] = { 0,0,0 };
//USER-DEFINED FUNCTION
void header();
void header()
{
printf("*-*-*-*-*CENSUS_INFO*-*-*-*-*");
printf("\n\n");
}
//PROGRAM STARTS HERE
main()
{
//VARIABLE-DECLARATION
int i = 0, j = 0;
//int no_of_records = 0;
//FUNCTION CALL-OUT
header();
printf("Enter No. of City : ");
scanf_s("%d", &j);
printf("\n\n");
printf("Enter Name of City, Population and Literacy level");
printf("\n\n");
for (i = 0;i < j;i++)
{
printf("City No. %d - Info :", i + 1);
printf("\n\n");
printf("City Name :");
fgets(cen[i].city, MAX, stdin);
printf("\n");
printf("Population : ");
scanf_s("%d", &cen[i].p);
printf("\n");
printf("Literacy : ");
scanf_s("%f", &cen[i].l);
printf("\n");
}
//TERMINAL-PAUSE
system("pause");
}
【问题讨论】:
-
@user3121023 有什么办法解决这个问题吗?
-
@Szymson scanf 在 Visual Studio 中不起作用。我们必须使用 scanf_s 和它给我的错误。
-
尝试使用 fgets() 到一个单独的 char 数组中,然后 sscanf() 从中解析。
-
你不能只用
scanf_s替换scanf;如果您有%s、%c或%[格式,当您想模拟fgets时,您必须为scanf_s中的每个格式提供最大缓冲区大小。但我支持@jamieguinan:在整个交互式输入中使用两步方法:首先读取一行,然后从该行读取数据。 -
scanf_s("%f", &cen[i].l);不使用数字后面的'\n'。然后下一个fgets(cen[i].city, MAX, stdin);读取该1 个字符'\n'。干脆不要用scanf()。