这个程序的目的是确保有效输入0到2之间的两个整数,中间有一个空格(严格来说没有其他),然后将这两个整数的结果赋值给变量。由于某些原因,这是不允许的。
非常基本的类型转换让我感到困惑。打印语句%i and %i
永远不会运行!我不明白为什么,尽管我用大括号括住了"成功"的部分。标签。我已经试过很多方法了。
#include <stdio.h>
#include <string.h>
int main(void)
{
int row, column;
char buffer[100];
}
printf("enter 2 values of row | column format n");
fgets(buffer,100,stdin);
sscanf(buffer,"%c %c",&row, &column);
printf("%i %i", row,column);
// only accepts integers between 0 and 2 inclusive
if ((((int)row >=48) && ((int)row <= 50 )) && ((int)column >= 48) && ((int)column <= 50))
{
printf("successn");
printf("%i and %i", atoi(row), atoi(column));
}
else
printf("failn");
return 0;
}
很好,OP正在尝试验证输入。
接收2int
:
char dummy; // Used to detect text after the 2 digits
if (sscanf(buffer,"%d %d %c", &row, &column, &dummy) != 2) {
puts("Input is not 2 ints");
}
然后测试范围
if (row < 0 || row > 2 || column < 0 || column > 2) {
puts("Outside 0 to 2 range");
}
为int
检测超出范围的文本所需的附加代码。如下所示,将int
的输入限制为每个1位,并记录两个int
之间的扫描偏移量,以确保有一些空白。
int n1, n2;
if (sscanf(buffer,"%1d%n %n%1d %c", &row, &n1, &n2, &column, &dummy) != 2 || n1 == n2) {
puts("Input is not 2 ints");
}
节省时间
启用所有编译器警告。一个好的编译器会抱怨sscanf(buffer,"%c %c",&row, &column);
——"%c"
期望的是char *
,而不是int *
。
远离scanf()
函数族。他们是许多问题的根源。
下面的内容应该很容易理解。当你醒来时,我很乐意为你解释任何你可能感到困惑的问题。
#include <stdio.h>
#include <string.h>
int main( void ) {
printf("enter 2 values of row | column format n");
char buf[ 100 ];
fgets( buf, 100, stdin );
if( buf[3] == 'n' // fgets leaves LF in the buffer
&& ('0' <= buf[0] && buf[0] <= '2' ) // limit ASCII digit
&& buf[1] == ' ' // single space between
&& ('0' <= buf[2] && buf[2] <= '2' ) // limit ASCII digit
) {
int row = buf[0] - '0', col = buf[2] - '0';
printf( "successn%i and %i", row, col );
} else
puts( "fail" );
return 0;
}