这是为了完成家庭作业,所以我坚持我所描述的要求。
我需要处理以下一般形式的输入:
XYZ A1 5
第一部分(XYZ
)是命令,A1
是地址(我只需要1),5
是命令的值。另外,我需要处理既没有地址也没有值的命令(例如,只有XYZ
),以及只有地址但没有值(XYZ A1
)的命令。
我成功地将这个带到了一起,似乎可以很好地处理所有 cough :
n = scanf("%c%c%c A%i %i",&c1,&c2,&c3,&a,&val);
所以我可以使用n
(有多少参数/变量scanf
设法匹配)来确定它是什么类型的命令,然后做一些基本的检查来得到我需要的东西。而且效果很好!
但这是我的问题:
还有一个XYZ A1 A2
格式的命令 - 因为它有两个地址'值。我如何让scanf
解析这个?再一次,我真的不需要' A'待解析。
如果我这样做:
scanf("%c%c%c A%i A%i",&c1,&c2,&c3,&a,&val);
然后当地址和价值输入没有“A'”时,其他各种命令都不会起作用。在他们面前。
P.S。不允许使用任何形式的字符串/数组,因此使用字符;
我可以在这做什么?
答案 0 :(得分:2)
请勿尝试在一次scanf
通话中完成所有操作。相反,首先阅读命令,检查是否需要其他参数,然后阅读:
n = scanf( "%c%c%c", &c1, &c2, &c3 );
if ( n != 3 )
// input error, bail out here
if ( has_address( c1, c2, c3 ) )
{
if ( scanf( "A%i", &a1 ) != 1 )
// input error, bail out here
}
if ( has_2nd_address( c1, c2, c3 ) )
{
if ( scanf( "A%i", &a2 ) != 1 )
// input error, bail out here
}
if ( has_value( c1, c2, c3 ) )
{
if ( scanf( "%i", &val ) != 1 )
// input error
}
has_address
,has_2nd_address
和has_value
只是占位符,无论您需要使用什么逻辑来确定是否需要读取一个或两个地址,以及是否需要阅读值。
答案 1 :(得分:0)
解决方法是使用scanf("%c%c%c A%i %c%i",&c1,&c2,&c3,&a, &c4, &val);
,检查c4是否为数字,在这种情况下,您需要做更多的工作才能获得正确的val,但不是很多。
答案 2 :(得分:0)
检查返回值。如果是4,则最后一个号码仍有待扫描。
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), R.style.DialogTheme)
.setView(binding.getRoot())
.create();
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
AppCompatDialog alert = builder.create();
alert.show();
首先使用// Add leading space to consume previous line's \n
int n = scanf(" %c%c%c A%i A%i", &c1, &c2, &c3, &a, &val);
switch (n) {
case 5: Handle_XYZ_A1_A2(c1, c2, c3, a, val); break;
case 4: // A not detected
int n = scanf("%i", &val);
if (n == 1) { Handle_XYZ_A1_2(c1, c2, c3, a, val); break; }
default:
Handle_Bad_Input();
}
更有意义,但考虑到OP限制似乎不允许。