说输入(stdin)是:
6 4
0 1 1 1 1 0
1 0 0 0 0 1
1 0 0 0 0 1
0 1 1 1 1 0
在第一行中,6和4分别是宽度和高度。
我做了
fgets(buf, sizeof(buf), stdin);
if(strlen(buf) > 4 || strlen(buf) < 4)
{
printf("Cannot decode\n");
return 1;
}
因此,如果我将第一行(宽度和高度)的整数数大于或小于2,则按Enter键,则会发生错误。
下一步是将其余输入放在2D数组中,board [height] [width]。
我做的是:
for(i = 0; i < height; i++)
{
for(j = 0; j < width; j++)
{
scanf("%d", &input);
board[i][j] = input;
}
}
但问题是,矩阵需要匹配宽度和高度。
例如,如果我分别输入6和4作为其宽度和高度, 然后,如果我把
0 1 1 1 1
然后按回车键,它需要立即发生错误,因为整数和宽度不匹配。
scanf忽略了回车键......那么如果我输入一些与宽度和高度不匹配的整数,怎么能让程序出错?
答案 0 :(得分:0)
那么如果我输入一些与宽度和高度不匹配的整数,怎么能让程序出错呢?
一种方法可能是:
1)将整行读成字符串 2)尝试从字符串
中读取width
个整数
重复height
次。
要跟踪字符串中的进度(步骤2),您可以在%n
调用中使用sscanf
来查找每次调用使用的字符数。
类似的东西:
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
int i, j;
int height, width;
char buf[256];
// Read size
if (fgets(buf, sizeof(buf), stdin) == NULL)
{
printf("Illegal input\n");
exit(1);
}
if (sscanf(buf, "%d %d", &width, &height) != 2)
{
printf("Illegal input\n");
exit(1);
}
// Use VLA (note: only do this for small matrices)
int board[height][width];
// Read the matrix
for (i=0; i < height; ++i)
{
if (fgets(buf, sizeof(buf), stdin) == NULL)
{
printf("Illegal input\n");
exit(1);
}
int consumed = 0;
int consumed_current;
for (j=0; j < width; ++j)
{
// Scan from string offset "consumed"
if (sscanf(buf+consumed, "%d%n", &board[i][j], &consumed_current) != 1)
{
printf("Illegal input\n");
exit(1);
}
// Move the offset in the string
consumed = consumed + consumed_current;
}
}
// Print
for (i=0; i < height; ++i)
{
for (j=0; j < width; ++j)
{
printf("%d ", board[i][j]);
}
printf("\n");
}
return(0);
}
注意:此代码仅检查 数据元素太少。如果输入行包含太多元素,则此代码将忽略其余元素。检查&#34;太多&#34;元素可以通过验证整个输入字符串已被sscanf
使用来完成。