2016-01-28 189 views
0

在給定的代碼中,fgets不會等待輸入。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"); 
} 
+0

@ user3121023有什麼辦法解決這個問題? – Eddy

+0

只使用'scanf()' – Szymson

+0

@Szymson scanf在Visual Studio中不起作用。我們必須使用scanf_s和它給我錯誤。 – Eddy

回答

2

我總是用後跟sscanffgets

聲明此頂部,

char line[MAX]; 

然後使用fgets取得一行,並sscanf解析int值出來,

printf("Enter No. of City : "); 
fgets(line, sizeof(line), stdin); 
sscanf(line, "%d", &j); 

l

類似的模式
printf("Literacy : "); 
fgets(line, sizeof(line), stdin); 
sscanf(line, "%f", &cen[i].l); 
+0

順便說一句,如果你對'j'使用大於3的值,你會溢出你的'cen]'數組,但這是一個單獨的問題。 – jamieguinan

+0

如@ user694733那樣檢查返回值會很好。我的例子是對原始文件的簡單修改,它應該用於理智的輸入。 – jamieguinan

+0

你能告訴我爲什麼當我使用大於3的j值時它溢出了嗎? – Eddy

2

當您輸入城市數量並按輸入,scanf不會從輸入中讀取換行符。 fgets然後嘗試閱讀但找到換行符,並立即停止。

不要使用scanf看號碼,使用fgets字符串,然後再閱讀sscanf(或strtol/strtof/strtod)轉換爲數字。

char temp[LIMIT]; 
if(fgets(temp, LIMIT, stdin)) { 
    if(sscanf(temp, "%d", &j) == 1) { 
     // Ok 
    } 
    else { 
     // Handle sscanf error 
    } 
} 
else { 
    // Handle fgets error 
} 
+0

thnx的幫助我真的很感激它:) – Eddy