c - 我应该如何使用 fgetc 忽略来自 stdin 的换行符?

标签 c arrays fgetc

我在使用 fgetc() 函数填充固定大小的二维数组时遇到问题。

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

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

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

有没有更好的方法来忽略来自标准输入的换行符并检查用户是否输入了比之前指定的更多的字符?

最佳答案

根据 '\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;
  }
}

关于c - 我应该如何使用 fgetc 忽略来自 stdin 的换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34020705/

相关文章:

c - 函数的返回值被破坏

c - 在C中初始化整数指针数组

php - 从 php 数组中回显一个项目

c - 为什么我的 C 程序总是给出 1 错误?

c - 具有不均匀 8 位成员的结构体大小不均匀

javascript - 如何在排序数组中插入值并保持数组排序?

c# - 数组的反序列化不支持类型

c - 从输入中获取数字的最佳方式?

c - C 标准和 C POSIX 中的 IO

c - get(file Pointer) 返回的值不变