Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我应该如何使用fgetc忽略stdin中的换行符?_C_Arrays_Fgetc - Fatal编程技术网

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

我应该如何使用fgetc忽略stdin中的换行符?,c,arrays,fgetc,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

我在使用
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---*/
(i=0;i{ 对于(j=0;j
以下是我的理解:

fgetc()
也扫描换行符('\n'),并将其放入下一行-这意味着
数组[1][0]
应该是
'\n'
。如果用户输入的字符数多于cols设置的字符数,则字符数将不是换行符,程序将以错误结束。然而,这不起作用


有没有更好的方法来忽略stdin中的换行符并检查用户输入的字符是否比前面指定的多

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

关键点是,在使用fgetc()读取一个字符后,您读取另一个字符以吞下换行符,然后继续

#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"); 
  }
}
#包括
int main(){
int行=3,cols=3;
int i,j;
字符数组[行][cols];
字符c;
对于(i=0;i
编辑

根据以下建议,如果您想在一行中输入所有字符,然后按换行符,如下所示:

val00 val01 val02[新线] val10 val11 val12[新线] val20 val21 val22[新线]

那么下面的方法就行了。[注意不要有尾随空格,因为它可能会破坏预期的功能]:

#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 if (c == '\n') {
        fgetc(stdin); 
        continue;   
      }
      array[i][j] = c;
      fgetc(stdin); // swallow space
    }
  }

  // print all 
  for(i = 0; i < rows; i++) {
    for(j = 0; j < cols; j++) {
      printf("%c ", array[i][j]); 
    }
    printf("\n"); 
  }
}
#包括
int main(){
int行=3,cols=3;
int i,j;
字符数组[行][cols];
字符c;
对于(i=0;i
根据
'\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;
  }
}
(i=0;i{ INTC; 对于(j=0;j换行符只在每行的末尾,因此吞下换行符的
fgetc
应该在内部循环之外(但在外部循环之内)。我同意这是一个更整洁的实现,但据我所知,他试图进入(0,0)换行符,(0,1)换行符,(0,2)换行符,(1,0),换行符(1,1)换行符(1,2)函数:
fgetc()
返回一个“int”值,而不是“char”值。因此变量
c
应定义为“int”,不幸的是,这不起作用。是,输入的格式应为:(如果cols==3;rows==3)--+[newline]+--[newline]-[newline]end of fgetc()您的代码在读取3行后不会停止,而是继续读取5行(我不知道为什么),然后循环结束,并打印数组[3][3]。fgetc()是我想到的唯一一个用于此情况的函数(我从C开始)。您还建议使用哪个函数?函数:
fgetc()
只返回一次击键。因此,当用户输入:
+时,对
fgetc()`的第一次调用将返回
+
。下一次调用
fgetc()
将返回密钥。发布的代码只允许
+
-
for()
循环执行的次数有限,因此数组中的每个其他条目都将为空。建议在循环中调用
fgetc()
,检查输入是否为允许值,如果不是,则再次循环!非常感谢你的帮助。现在看来它工作正常。我只需要删除第一个if语句中的return1,并将“ch==EOF”更改为“c”。再次感谢您。顺便说一句,如果可以使用,fgetc()
。备选方案:
fgets()
用于文本,或
fread()
用于二进制。避免使用
scanf()
,不要使用
get()