C语言 为什么下一行不运行?



这个程序的目的是确保有效输入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;
}

最新更新