这是作业,所以我坚持我描述的要求。
我需要处理以下一般形式的输入:
XYZ A1 5
第一部分(XYZ
)是命令,A1
是地址(我只需要1),5
是命令的值。此外,我需要处理既没有地址也没有值的命令(例如只有 XYZ
),以及只有地址没有值的命令(XYZ A1
)。
我设法把它粘在一起,这似乎可以很好地处理所有咳嗽:
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”时,其他各种命令将不起作用。
附言不允许使用任何形式的字符串/数组,因此是字符;
我可以在这里做什么?
最佳答案
不要尝试在单个 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
只是占位符,用于您需要使用的任何逻辑来确定是否需要读取一个或两个地址,以及是否需要读取一个值。
关于c - 如何使用 scanf 正确解析和过滤动态输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39618781/