2017-03-16 36 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(); 
}