2017-03-16 33 views
0

我想將getchar的使用切換到fgets,但是在使用getchar時,整個代碼不起作用。從getchar切換到fgets

//fgets(line, sizeof(line), stdin); 

    while(fgets(line, sizeof(line), stdin)) 
    { 
    portNum[sizeof(line)] = (char)line; 
    } 

while((c = getchar()) != '\n') 
{ 
    portNum[num++] = c; 
} 
portNum[num] = '\0'; 

我該如何讓這兩個功能平等地正常工作?

+0

被替換爲'與fgets(行的sizeof(線),標準輸入)'第二個參數是要複製到str中的最大字符數(包括終止空字符)。給它定義一個值。另外,'fgets'將繼續讀取,直到遇到換行符。不需要while循環。 – Ayush

+2

'portNum [sizeof(line)] =(char)line;'你有什麼想法你在做什麼? –

回答

1

您使用fgets是錯誤的。

fgets從流中讀取字符和將它們存儲爲C字符串到STR直到已經讀取或達到任一換行或結束文件(NUM-1)的字符,先發生者爲準。

在你的情況下,fgets將讀取所有字符,直到遇到換行符爲止。

此外,參數的用法是錯誤的。

char * fgets(char * str,int num,FILE * stream);

str =>指向複製字符串讀取的字符數組的指針。

num =>要複製到str的最大字符數(包括終止空字符的 )。

stream =>指向標識輸入流的FILE對象的指針。 stdin可以用作從標準輸入讀取的參數。

有關更多信息,請參閱fgets文檔。

fgets man page

1

OP的fgets()用途不明確,portNum[sizeof(line)] = (char)line;肯定是錯誤的。

相反:如何讓下面的getchar()代碼更fgets()樣:

// assumed missing code 
#define N 100 
int c; 
char portNum[N]; 
size_t num = 0; 

// size and EOF detection added (which should have been there) 
while(num + 1 < sizeof portnum && (c = getchar()) != '\n' && c != EOF) { 
    portNum[num++] = c; 
} 
portNum[num] = '\0'; 

// assumed missing code 
if (c == EOF && num == 0) Handle_EndOfFile_or_InputError(); 
else ... 

這可以fgets()代碼

#define N 100 
char portNum[N+1]; // 1 larger for the \n 

if (fgets(portNum, sizeof portNum, stdin)) { 
    // lop off potential trailing \n 
    portNum[strcspn(portNum, "\n")] = '\0'; 
    ... 
} else { 
    Handle_EndOfFile_or_InputError(); 
}