我应该如何使用fgetc忽略stdin中的换行符?

时间:2015-12-01 12:41:34

标签: c arrays fgetc

使用fgetc()函数填充固定大小的2D数组时遇到问题。

我的程序应该只能读取'-''+''!',并且在一行中输入的字符必须等于列的大小。

以下是我的代码中有问题的部分:

for(i = 0; i < rows; i++) {
  for(j = 0; j < cols; j++) {
    c = fgetc( stdin );
    if( (c != '-') && (c != '+') && (c != '!') ) {
      printf( "Incorrect value.\n" );
      return 1;
    }
    array[i][j] = c;
  }
  if(array[i+1][0] != '\n') {
    printf( "Incorrect value (size does not equal to columns).\n" );
    return 1;
  }
}/*---end of for---*/

以下是我的理解:

fgetc()也会扫描换行符char('\ n')并将其放在下一行 - 这意味着array[1][0]应为'\n'。如果用户输入的字符数多于cols设置的字符数,则它将是除换行符之外的其他字符,程序将以错误结束。但是这不起作用。

是否有更好的方法可以忽略stdin中的换行符并检查用户是否输入的字符数多于之前指定的字符数?

2 个答案:

答案 0 :(得分:1)

针对'\n'测试价值并使用int

不要将fgetc()的返回值保存到char数组中,以后再进行测试。这会使EOF与其他char区分开来。

当预期'\n'(或EOF)时,这很好。

建议使用正逻辑测试,因为它更容易理解

for (i = 0; i < rows; i++) {
  int c;
  for (j = 0; j < cols; j++) {
    c = fgetc( stdin );
    if (c == '-' || c == '+' || c == '!') {
      array[i][j] = c;
    } else {
      puts("Incorrect value.");
      return 1;
    }
  }
  c = fgetc( stdin );  // Read and consume the end-of-line
  if (!(c == '\n' || c == EOF)) {
    printf( "Incorrect value (size does not equal to columns).\n" );
    return 1;
  }
}

答案 1 :(得分:0)

我并不特别宽恕fgetc()的使用,但如果你坚持使用它,我认为你想要做的工作版本如下。

关键位是,在用fgetc()读取一个字符后,你读另一个来吞下换行符,然后继续......

css for wrapper div
#wrapperDiv {
    position: absolute;
    width: 100%;
    height:1341px;
    left: 0px;
    border: 5px solid #408080;
    overflow:hidden;
}

css for table inside the wrapper div
#Table {
    position: absolute;
    width: 940px;
    height: 319px;
    left: 409px;
    top: 215px;
}

修改

根据以下建议,如果您想在一行中输入所有字符,然后点击换行符,请执行以下操作:

  

val00 val01 val02 [换行符]   val10 val11 val12 [换行符]   val20 val21 val22 [newline]

然后下面的工作。 [注意不要有尾随的空格,因为它可能会破坏预期的功能]:

#include <stdio.h> 

int main() {
  int rows = 3, cols = 3; 
  int i, j;  
  char array[rows][cols]; 
  char c; 
  for(i = 0; i < rows; i++) {
    for(j = 0; j < cols; j++) {
      c = fgetc(stdin); 
      if( (c != '-') && (c != '+') && (c != '!') ) {
        printf( "Incorrect value.\n" );
        return 1;
      }
      else {
        array[i][j] = c;
        // swallow the newline 
        fgetc(stdin);   
      }
    }
  }

  // print all 
  for(i = 0; i < rows; i++) {
    for(j = 0; j < cols; j++) {
      printf("%c ", array[i][j]); 
    }
    printf("\n"); 
  }
}