使用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中的换行符并检查用户是否输入的字符数多于之前指定的字符数?
答案 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");
}
}