从getchar切换到fgets

时间:2017-03-16 06:19:47

标签: c while-loop fgets getchar

我正在尝试将getchar的使用转换为fgets但是,当使用getchar时,整个代码都不起作用。

//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';

如何让这两个功能正常工作?

2 个答案:

答案 0 :(得分:1)

您使用fgets是错误的。

  

fgets从流中读取字符并将它们作为C字符串存储到str中,直到读取(num-1)个字符或者到达换行符或文件结尾为止,以先发生者为准。 / p>

在您的情况下,fgets会读取所有字符,直到遇到换行符。

另外,参数用法是错误的。

  

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

     

str =>指向复制字符串读取的字符数组的指针。

     

num =>要复制到str的最大字符数(包括   终止空字符)。

     

stream =>指向标识输入流的FILE对象的指针。   stdin可以用作从标准输入读取的参数。

有关详细信息,请参阅fgets文档。

fgets man page

答案 1 :(得分: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();
}