如何使用scanf正确解析和过滤动态输入?

时间:2016-09-21 14:01:06

标签: c scanf

这是为了完成家庭作业,所以我坚持我所描述的要求。

我需要处理以下一般形式的输入:

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。不允许使用任何形式的字符串/数组,因此使用字符;

我可以在这做什么?

3 个答案:

答案 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_addresshas_2nd_addresshas_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限制似乎不允许。