写一个响亮的失败scanf:哪个是类型签名?

时间:2016-03-09 14:44:53

标签: c input types scanf

我决定编写<table id = "menu-container" border = "2"> <caption>Main Dish<caption> <tr> <?php if($result->num_rows > 0) { $i=0; while($row = $result->fetch_assoc()) { ?> <td class = "wrapword"> <img src = "data:image/jpeg; base64 , <?php echo base64_encode($row['product_image']); ?>" height = "290" width = "350"> <br> &nbsp;Name: <?php echo $row['product_name']; ?> <br> &nbsp;Price: Php<?php echo $row['product_price']; ?> <label id = "add-to-list">Add to list</label> </td> <?php $i++; if($i%4==0 && $i<$result->num_rows) echo '</tr><tr>'; } } else { echo "No Menu Found"; } ?> </tr> </table> C函数的变体,而不是返回scan表示成功或失败会打印错误消息并在出错时中止程序。

int

问题是写代码而不是void aborting_scanf(const char *format, ???) { if (scanf(format, &var) != 1) puts("Invalid input"); exit(1); } ,在the man page中,类型签名是:

???

但是,我如何命名目标变量?

理论上我可以手工为每种类型编写一个版本,但它会非常重复,所以我正在寻找一种更通用的解决方案来避免代码重复。

2 个答案:

答案 0 :(得分:4)

您需要使用variable arguments以及vscanf

void aborting_scanf(const char *format, ...) {  
  va_list ap;

  va_start(ap, format);
  if (vscanf(format, ap) != 1) {
    puts("Invalid input");
    exit(1);
  }
  va_end(ap);
}

...参数告诉编译器剩下的参数有不同的类型和数字,可以是任何东西。 va_list类型的变量允许您访问这些值,vscanf函数可以直接读取它。

答案 1 :(得分:1)

scanf使用变量参数列表,如...参数所示。您可以使用stdarg.h中的函数来操纵它们。这种格式不适合全面介绍变量参数列表,阅读有关它的教程/书籍。