如何读取整数数组

时间:2016-03-27 14:03:28

标签: c

我可以将数组作为整数读取并将其分成数字。 这是我想要做的代码。

#include <stdio.h>

int main(void)
{
    int d [12],
    first_sum, second_sum, total; 

    printf("Enter the UPC code (11 digits): ");

    scanf("%s", d);

    first_sum = d[0] + d [2] + d [4] + d[6] + d[8] + d[10];
    second_sum = d [1] + d [3] + d [5] + d [7] + d [9];
    total = (3 * first_sum) + second_sum;

    printf("Check digit: %d\n", 9 - ((total - 1) % 10));

    return 0;
}

如您所见,我正在尝试计算UPC代码的校验位。 我想要的是将11位数字分成1位整数并计算校验位。请告诉我,我的错误是什么?希望你理解我的问题:)

3 个答案:

答案 0 :(得分:3)

  

我可以将数组作为整数读取并将其分成数字吗?

是的,你可以。使用char数组读入整数的字符串表示形式,然后将数组的每个字符元素转换为相应的数字值。

int d[11];
char stringArray[12];//11 digit characters, + Null terminator.
scanf("%11s", stringArray); //stringArray now contains a string
                            //representation of your number. 
                            //Important: note the format specifier to 
                            //limit scanf to read only 11 characters.

要将string转换为整数数组,请使用它 ASCII 值:

for(i=0;i<11;i++)
{
     if(!isdigit(stringArray[i]))return -1;//test input, and leave if not digit
     d[i] = stringArray[i] - '0';//ASCII '0' to '9' have decimal values of 48 to 57 
}

答案 1 :(得分:3)

这样做有很多可能性。这是另一种不使用字符串的方法,尽管我喜欢使用字符串的方式。我在这里做的是将偶数位置的数字从倒数加到first_sum,将奇数位数加到second_sum,就像在OP的代码中一样。

#include <stdio.h>

int main() {
    long long input;
    int first_sum=0, second_sum=0, total, i;

    printf("Enter the UPC code (11 digits): ");

    if(scanf("%lld", &input) == 1)
    {
        i = 0;
        while (input)
        {
            if (i % 2 == 0)
                first_sum += input % 10;
            else
                second_sum += input % 10;
            input /= 10;
            i++;
        }
    }

    total = (3 * first_sum) + second_sum;

    printf("Check digit: %d\n", 9 - ((total - 1) % 10));

    return 0;
}

一点视觉辅助:

这里i是循环计数器,对于从右到左书写的11位UPC代码,从0到10。让11位用户输入为&#34; 12345678901&#34;

i            :  10  9  8  7  6  5  4  3  2  1  0
i % 2        :   0  1  0  1  0  1  0  1  0  1  0
Even/Odd     :   E  O  E  O  E  O  E  O  E  O  E
Input digits :   1  2  3  4  5  6  7  8  9  0  1

正如您所看到的,对于i i % 2 == 0的值,相应的数字被认为是在偶数(E)位置,并且总和为{ {1}}。对于first_sum情况,相应的数字被认为是在奇数(O)位置,并且总计为i % 2 == 1

所以second_sum最终成为&#34; 1 + 3 + 5 + 7 +9 + 1&#34;和first_sum正在&#34; 2 + 4 + 6 + 8 + 0&#34 ;.希望能让它更清晰。

答案 2 :(得分:1)

记住字符串是一个字符数组,您可以以字符串形式读取用户输入,然后进行处理。你需要注意一些问题。

注意:以下所有代码示例都是使用gcc版本4.8.3编译的,命令行是:gcc -g -std=c11 -pedantic -Wall temp.c -o temp,主机平台是Windows 7。

请考虑以下代码段:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char   upc[12];

    printf("Enter the UPC code (11 digits):");
    scanf("%11s", upc);

    printf("upc[0]: %c\n", upc[0]);
    printf("upc[2]: %c\n", upc[2]);

    return 0;
}
  1. 首先注意我在scanf中指定了一个宽度参数 format-string所以我不会溢出upc缓冲区。它总是一个 防御性编程的好主意,并始终验证用户输入(NB: 我还没有完全验证上面的用户输入,见下面的
    完整验证)。
  2. 如果我运行此程序,如下所示,请注意其值 upc[0]和upc [2]是。这意味着我们认为UPC的最低有效位(个位数)存储在数组的第10个元素中,而我们认为最重要的数字存储在数组的第0个元素中。这可能或可能不是您的问题,您可以调整公式或尊重输入的字符串。

    Q:\>temp 
    Enter the UPC code (11 digits):12345678901
    upc[0]: 1
    upc[2]: 3
    upc is: 12345678901
    
  3. 现在进行完整的输入验证,这些是我们需要检查的事情,

    1. 字符串长度恰好是11个字符。
    2. 字符串只包含数字。
    3. 字符串不超过总长度(包括null) 这是通过格式的宽度为我们完成的 串
    4. 第一个很简单,只需检查字符串的长度,如果不等于11则给出错误并退出程序。对于第二个条件,我们需要查看字符串的每个元素并检查它是否是一个数字。以下包含所有输入验证检查:

      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <stdbool.h>
      #include <ctype.h>
      
      bool isDigit(char*);
      
      int main()
      {
          char   upc[12];
      
          printf("Enter the UPC code (11 digits):");
          scanf("%11s", upc);
      
          if(strlen(upc) == 11) 
          {
              if(isDigit(upc)) 
              {
                 // perform your calculations here
              } 
              else 
              {
                  printf("The UPC must contain only digits\n");
              }
          }
          else
          {
              printf("The UPC must be exactly 11 digits long\n");
          }
      
          return 0;
      }
      
      bool isDigit(char* upc)
      {
          bool   bRet = true;
      
          for(int ndx = 0; ndx < strlen(upc); ndx++)
          {
              if(!isdigit(upc[ndx]))
              {
                  bRet = false;
                  break;
              }
          }
      
          return bRet;
      }