首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >程序卡在扫描程序

程序卡在扫描程序
EN

Stack Overflow用户
提问于 2018-11-10 01:12:28
回答 2查看 565关注 0票数 1

基本上,我试着写一个程序,作为我课本上的一个练习,用户输入一个12位数字,在一系列操作之后,一个“校验数字”被打印出来。这是我的密码。

代码语言:javascript
复制
#include <stdio.h>

int main(){
  int one = 0, two = 0, three = 0, four = 0, five = 0, six = 0, seven = 0,
      eight = 0, nine = 0, ten = 0, eleven = 0, twelve = 0;
  int check_digit;

  printf("Enter the first 12 digits of an EAN: ");
  scanf("%d%d%d%d%d%d%d%d%d%d%d%d", &one, &two, &three, &four, &five, &six, &seven, 
                                    &eight, &nine, &ten, &eleven, &twelve);

  check_digit = 9 - (((two + four + six + eight + ten + twelve)*3 +
            (one + three + five + seven + nine + eleven))-1)%10;

  printf("Check digit: %d\n\n", check_digit);

  return 0;
}

问题是,程序输出绝对没有,而且它似乎从来没有经过扫描,因为我总是能够添加更多的数字,即使在输入了12个初始数字,并点击enter。我甚至没有收到任何警告或错误。我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-10 02:23:11

因为你的扫描是使用%d%d%d%d%d%d%d%d%d%d%d%d的。预计将有12个数字。所以,如果你输入123456789012,程序只扫描一个数字。它读的是123456789012,而不是你想要它在哪里one = 1,然后two = 2等。

您可以通过将扫描更改为:

scanf("%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d", &one, &two, &three, &four, &five, &six, &seven, &eight, &nine, &ten, &eleven, &twelve);

%1d将读取一位数。所以现在它会做你想做的事情,比如one = 1,然后是two = 2等等。

解决这一问题的另一种方法是将数字读入字符串。将字符串转换为int数组。下面我已经给出了如何做到这一点的代码。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE        12

// Function prototypes
void str_arr_to_int_arr(char str[], int num[], int len);
int check_digit(int EAN[], int len);

int main(void) {

    char EAN_str[MAX_SIZE + 1];
    int EAN_int[MAX_SIZE + 1];

    printf("Enter the first 12 digits of an EAN: ");
    scanf("%12s", EAN_str);

    str_arr_to_int_arr(EAN_str, EAN_int, MAX_SIZE);

    int answer = check_digit(EAN_int, MAX_SIZE);

    printf("Check digit: %d\n", answer);

    return 0;
}

// This function will convert a char array into an int array
void str_arr_to_int_arr(char str[], int num[], int len) {

    int i = 0;
    while (i < len) {

        if (str[i] >= '0' && str[i] <= '9') {
            num[i] = str[i] - '0';
        } else {
            printf("ERROR: You entered a non-number\n");
            exit(1);
        }

        i++;
    }

}

// Does the check_digit formula on an EAN
int check_digit(int EAN[], int len) {

    int sum_pos = 0;
    int sum_neg = 0;

    int i = 0;
    while (i < len) {

        if (i % 2 == 0) {
            sum_pos += EAN[i];
        } else {
            sum_neg += EAN[i];
        }

        i++;
    }

    return (9 - (((sum_pos * 3) + sum_neg) - 1) % 10);
}
票数 1
EN

Stack Overflow用户

发布于 2018-11-10 02:29:17

我做错了什么?

OP想要读取一个12位的代码,但是scanf("%d%d%d%d%d%d%d%d%d%d%d%d"...需要12个单独的int

@user3386109 3386109很好地建议使用"%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d"将每个int的长度限制为1位。

备选方案:

由于艾恩的长度可达18位,请考虑

代码语言:javascript
复制
#define EAN_N 18
char buf[2*EAN_N];  // extra for \n, \0 and other other characters.
if (fgets(buf, sizof buf, stdin)) {
  int n = 0;
  while (buf[n] >= '0' && buf[n] <= '9') n++;
  if (buf[n] == '\n' || buf[n] == '\0' && <= EAN_N) {
    switch (n) {
       case 12: 
         // OP's original code
         break;
       case TBD: 
         // handle of cases TBD
    }
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53235182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档