我应该如何使用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()
。