验证scanf

时间:2013-11-05 22:07:46

标签: c scanf

我还是C的新手,我正在尝试验证用户的输入。它必须是'C'int int int或'L'int int int int的形式。他们也可以根据自己的意愿输入。我测试第一个字符,然后使用3或4个后续的整数 - 这些用于在其他函数中创建一些结构。我无法工作的是底部的其他部分。我希望它拒绝任何不是l / L / c / C

的“类型”

到目前为止我已经

   counter = 0 ;
   while ( type != '\n' )
   {  

      scanf("%c", &type) ;
      if ( type == 'L' || type == 'l')
      {
         scanf(" %d %d %d %d", &llx, &lly, &urx, &ury) ;
         Line line = makeline(llx,lly,urx,ury) ;
         shape = makeshapeline( line ) ;
         box = makeboxshape( shape ) ;
         counter++ ;
      }
      else if ( type == 'C' || type == 'c')
      {
         scanf(" %d %d %d", &x, &y, &rad) ;
         Circle circle = makecircle(x, y, rad) ;
         shape = makeshapecircle( circle ) ;
         box = makeboxshape( shape ) ;
         counter++ ;
      }
      else
      {
         printf("Invalid input\n") ;
         return 0 ;
      }

      if (counter == 1) 
      {
         boxfinal = box ; //On the first run initialise the final box to the first result
      }  

      if (counter > 1)
      {
         boxfinal = makeboxbox( box, boxfinal) ;
      }
   }

非常感谢

2 个答案:

答案 0 :(得分:1)

您可以考虑scanf使用%s而不是%c,然后解析生成的字符串。原因是scanf("%s", str)会自动忽略空格,但scanf("%c", char)会返回空白字符,例如\n,这是您不想要的。

编辑:作为更一般的注释,正如已经在一些评论中提到的那样,如果你只提取字符串,整数和浮点数,你不必担心在scanf函数族中插入空格。 (也许是我忘了的东西),因为这些函数在提取这些数据类型时都会忽略输入字符串中的空格。 (除非用户另有指定,否则提取的字符串将始终没有空格。)

答案 1 :(得分:0)

建议fgets()/sscanf()

char buf[100];
while (fgets(buf, sizeof(buf), stdin) != NULL) {
  if (4 == sscanf(buf, "%*1[Ll]%d%d%d%d", &llx, &lly, &urx, &ury) {
    do_line();
  else if (3 == sscanf(buf, "%*1[Cc]%d%d%d", &x, &y, &rad) {
    do_circle();
  else
    do_Invalid_input();
}