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

标签 c scanf

这是作业,所以我坚持我描述的要求。

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

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_addresshas_2nd_addresshas_value 只是占位符,用于您需要使用的任何逻辑来确定是否需要读取一个或两个地址,以及是否需要读取一个值。

关于c - 如何使用 scanf 正确解析和过滤动态输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39618781/

相关文章:

c - 将 char * 数字转换为 int32_t 的正确方法

c - 质数计算器。这些都正确吗?

c - PPM扫描和打印

c - 了解 "while (getchar() != '\n')"

硬币-文件读取方法中的SPOJ TLE

c - 哪种方法更好——更多条件还是更多变量?

c - 链接 : fatal error LNK1104: cannot open file 'C:\Users\hp\.pyxbld\lib.win32-2.7\gensim\models\word2vec_inner.pyd'

c - 导致段错误的结构

C编程: Input is assigned but output display shows the incorrect value

无法建立正确的采集循环 - C