c-通用产品代码挑战

  • 本文关键字:代码 挑战 c operators
  • 更新时间 :
  • 英文 :


我很好奇如何在C语言中正确使用%d。我目前正在学习C编程课程,我们收到了一个小挑战,要编辑教科书中的代码(C编程现代方法,K.N.KING)。目标是从条形码的三个输入中编辑代码:

  • 最后一个输入的第1位、第5位和第5位,或
  • 所有11位数字同时出现

按照文本解释运算符的方式,我相信%1d允许将输入的整数单独分配给相应的变量。下面是经过编辑的代码。

#include <stdio.h>
int main(void)
{
    /* 11 integers that come from the bar code of the product, 
    then 2 intermediate variables for calulation, and lastly the final answer.*/
    int d, i1, i2, i3, i4, i5, j1, j2, j3, j4, j5, first_sum, second_sum, total;    
    printf("Enter the 11 digit Universal Product Code: ");
    scanf("%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d", &d, &i1, &i2, &i3, &i4, &i5, &j1, &j2, &j3, &j4, &j5);
    // The steps for each calculation from the textbook.
    first_sum = d + i2 + i4 + j1 + j3 + j5;
    second_sum = i1 + i3 + i5 + j2 + j4;
    total = 3 * first_sum + second_sum;
    // Prints check digit for given product code.
    printf("Check Digit: %dn", 9 - ((total-1) % 10));
    return 0;
}

然而,当我运行程序时(与原始程序相同的问题),它不接受11位数字作为11个单独的数字输入,只接受一个大数字。相反,它仍然要求在每个整数后面都输入回车。整数可以这样读取并分配给变量吗?

给定下面的代码,如果您键入"123",然后按enter键,它将打印"1 2 3"。

int main( void )
{
    int a, b, c;
    printf( "Enter a three digit numbern" );
    if ( scanf( "%1d%1d%1d", &a, &b, &c ) != 3 )
        printf( "hey!!!n" );
    else
        printf( "%d %d %dn", a, b, c );
}

也就是说%1d将一次读取一个数字。


以下示例来自C11规范草案第7.21.6.2节

EXAMPLE 2 The call:
    #include <stdio.h>
    /* ... */
    int i; float x; char name[50];
    fscanf(stdin, "%2d%f%*d %[0123456789]", &i, &x, name);
with input:
    56789 0123 56a72
will assign to i the value 56 and to x the value 789.0, will skip 0123,
and will assign to name the sequence 56. The next character read from 
the input stream will be a.

一直都是这样,所以如果你的编译器不这样做,你需要一个新的编译器。

问题的简短答案是否定的。%d标记将获取它所能获取的最大整数,而不仅仅是一个数字,除非字符串中有某种分隔空间。

解决此问题的一般方法是将输入读取为字符串,然后使用strtok或类似方法标记输入。

然而,由于在C中,字符串只是字符数组,您也可以遍历一个循环并调用string[0]、string[1]等,只要事先知道输入的长度,就可以将它们分别转换为一个整数

好吧,我刚刚测试了以下程序:

#include <stdio.h>
int main (void) {
    int n, x, y, z;
    n = sscanf ("1234567890", "%1d%1d%1d", &x, &y, &z);
    printf ("Found %d items: %d, %d and %dn", n, x, y, z);
    return 0;
}

我在SlackwareLinux下用GCC和glibc编译了它。它输出:

找到3个项目:1、2和3

所以,它似乎应该按照你希望的方式工作,但我不确定这是否真的是标准行为,或者更确切地说是GCC的扩展。

另一种选择是用%1c一次读取一个字符,然后用atoi()将其转换为相应的整数,或者简单地从中减去'0',如果您必须/想要绝对使用scanf()的话。否则,我将使用%s读取整个字符串,然后对单个字符进行迭代,这在C中非常容易,因为字符串只是一个字符数组。

您的代码应该在gcc comliler中工作。但是,由于它不起作用,您应该将11位数字转换为一个字符数组,即字符串,然后在数组中迭代,同时将每个字符转换为相应的整数值。在您的情况下,只需计算array[i]-'0'(即d = array[0]-'0'i1 = array[1]-'0'等)即可获得该值。

相关内容

  • 没有找到相关文章

最新更新