扫描整数的第二个数字

时间:2018-10-02 17:41:05

标签: c scanf

此程序将输入两个数字(每个数字两位)。然后,它将第一个条目的第二位数字与第二个条目的第一个字符配对。

示例输入:

8 9 4 3

输出:

94

(9是第一个数字的第二位,而4是第二个数字的第一位)。我知道如何扫描整数的第一个数字,但我似乎无法弄清楚如何扫描第二个数字。

编辑:这是我遇到的问题:

int a,b;

scanf("%d %1d",&a,&b);
printf("%d %d",a,b);

2 个答案:

答案 0 :(得分:0)

  

程序正在输入两个数字(每个两位数字)作为输入
  扫描整数的第二个数字

以1位数字扫描不是达到最终目标的可靠方法。只需扫描两个int,测试是否< 100,然后使用/10%10提取数字。

这种方法更容易检测和处理错误输入。

int a,b;

if (scanf("%d %d",&a,&b) != 2) puts("Bad input");
else if (a < 10 || a >= 99 || b < 10 || b > 99) puts("Input out of range");
else {
  printf("%d %d --> ",a,b);
  printf("%d%d\n",a%10,b/10);
}

如果代码想处理前导零,则代码可以用fgets() line 中读取,然后以各种方式进行解析。坚持使用scanf(),代码可以使用"%n"记录扫描偏移量。

int n1,n2,n3,n4=0;
if (scanf(" %n%d%n %n%d%n",&n1,&a,&n2, &n3,&b,&n4) != 2) puts("Bad input");
else if (n2-n1 != 2 || a < 0 || n4-n3 != 2 || b < 0) puts("Input out of range");
else {
 /* as above */
}

注意:这仍然不会将"+3 -0"之类的输入标记为错误。

答案 1 :(得分:0)

如果您确信只需要处理两对数字,那么可以考虑使用*修饰符来抑制分配:

if (scanf("%*1d%1d %1d%*1d", &a, &b) != 2)
    …oops…
else
    printf("%d%d\n", a, b);

输入格式中的空格是可选的,因为%1d仍会跳过它。您无法确定最后%*1d是否不匹配。

如果输入数据格式不可靠,请使用fgets()读取一行,然后使用sscanf()对其进行解析;您可以更好地报告错误,并在适当的情况下使用其他格式重试。另外,使用字符串/字符输入是另一种选择。