scanf中的额外/缺失字符
这是我的输入函数:scanf中的额外/缺失字符,c,input,scanf,getchar,C,Input,Scanf,Getchar,这是我的输入函数: int input( int array[500][500], int *x0, int *y0 ) { int x = 0; int y = 0; int err = 0; int temp = 0; char c; char s[2]; printf("Enter sizes:\n"); if (scanf("%d %d%c", x0, y0, &c) !=3 || *x0 <
int input( int array[500][500], int *x0, int *y0 ) {
int x = 0;
int y = 0;
int err = 0;
int temp = 0;
char c;
char s[2];
printf("Enter sizes:\n");
if (scanf("%d %d%c", x0, y0, &c) !=3 ||
*x0 <= 0 || *y0 <= 0 || *x0 > 500 || *y0 > 500 || c!='\n' ) {
printf("Invalid input.\n");
return 0;
}
while (y < *y0) {
x = 0;
temp = 0;
while ( x < *x0 ) {
if ( scanf("%1s", s)==1 ) {
c = *s;
} // so that ooo is written into three array fields
switch(c) { // only these three chars are accepted
case 'o':
array[y][x] = 1;
break;
case '.':
array[y][x] = 0;
break;
case '!':
array[y][x] = 2;
break;
default:
err = 1;
break;
}
x++;
temp = x;
if (temp > *x0) // my attempt
err = 1;
}
if (x != *x0)
err = 1;
y++;
}
if (y != *y0)
err = 1;
if (err == 1) {
printf("Invalid input.\n");
return 0;
}
return 1;
}
它应该打印无效输入。
,因为第二个条目有4个字符而不是3个字符。同样,如果我写了2个字符而不是3个,它也应该打印错误消息
我的想法是,每次读取字符后,我都会将该字符写入数组(如果字符被接受),然后x++
这样我就可以将下一个输入写入下一个字段。因此,如果我有4个字符,并且只接受3个,x
变成4
,temp
也变成4
<代码>4>3soerr=1
那么,我的解决方案有什么问题?正确的解决方案是什么?提前感谢。如果您想声明用户为矩阵的每一行分别输入字符,请使用
fgets()
读取一行并手动解析该行,跳过空白字符并适当处理接受的字符。到达矩阵行的末尾后,如果行中还有非空格字符,请进行投诉
顺便说一句,如果字符被接受,您应该只增加
x
。在当前版本中,即使检测到不正确的字符,也会增加x
。逻辑的哪个部分不可见?首先我写3个数字,基本上是矩阵的大小。然后我只写矩阵o
,允许使用代码>或
。如果我写的矩阵是3x3,并且我输入了一行有4个字符,当然这是错误的,我需要能够发现错误。当scanf不返回1,然后什么都不返回时会发生什么。如果不是字符串,scanf将不会返回1。即使它是一个字符串,我的开关也会显示,除非它是三个字符之一,否则我的错误标志会弹出。你确定吗?检查您的逻辑如果scanf失败(为什么使用%1s是另一回事)您继续手动使用cBy parse line的上一个值,您的意思是写入临时字符数组,然后检查有多少个字母,然后将其写入我的数组?很抱歉再次打扰您。我试过玩一下,这就是我想到的:。尽管我没有更改代码中的y
,但此代码始终在y-2条目处停止。在您引用的代码中,fgets()
没有足够的空间读取缓冲区中第一行的'\n'
。第二行将为空:您只需从第一行读取'\n'
。扫描代码不会在'\0'
处停止,此'\0'
将被视为无效字符,设置为err=1
。在行尾,由于在err
上进行了测试,您将使用y
=1
提前中断行循环。将缓冲区设置为501字节,在'\0'
处停止扫描,不要在无效字符或空格字符上增加x
。我最终的工作方式是:我仍然不明白为什么不应该在无效字符上增加x
。我的意思是,这就是开关的作用。默认值
具有err=1
,因此除非读取了正确的输入,否则该标志将向上。