我可以将数组作为整数读取并将其分成数字。 这是我想要做的代码。
#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位整数并计算校验位。请告诉我,我的错误是什么?希望你理解我的问题:)
答案 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;
}
upc
缓冲区。它总是一个
防御性编程的好主意,并始终验证用户输入(NB:
我还没有完全验证上面的用户输入,见下面的如果我运行此程序,如下所示,请注意其值
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
现在进行完整的输入验证,这些是我们需要检查的事情,
第一个很简单,只需检查字符串的长度,如果不等于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;
}