0

我正在编写的程序获取一个数字并将该数字显示为计算器会显示它(如下所示)正在编译没有问题,但是当我尝试运行它时,我可以输入我的数字,但没有任何反应。似乎它正在“挂起”,因为没有像我预期的那样显示进一步的输出。可能有人知道问题是什么吗?

#include <stdio.h>
#define MAX_DIGITS 20

char segments[10][7] =              /* seven segment array */
    {{'1','1','1','1','1','1','0'}, /* zero */
     {'0','1','1','0','0','0','0'}, /* one */
     {'1','1','0','1','1','0','1'}, /* two */
     {'1','1','1','1','0','0','1'}, /* three */
     {'0','1','1','0','0','1','1'}, /* four */
     {'1','0','1','1','0','1','1'}, /* five */
     {'1','0','1','1','1','1','1'}, /* six */
     {'1','1','1','0','0','0','0'}, /* seven */
     {'1','1','1','1','1','1','1'}, /* eight */
     {'1','1','1','0','0','1','1'}};/* nine */
char digits[3][MAX_DIGITS * 4];     /* digits array */
int i, j;                           /* count variables */
int adjust;                         /* output formatting */

int main(void) {
    clear_digits_array();

    int digit[20];
    for (i = 0; i < 20; i++) {
        digit[i] = 0;
    }

    int count = 20;
    int position = 0;

    printf("Enter a number: ");

    int number = scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",
            &digit[0],
            &digit[1],
            &digit[2],
            &digit[3],
            &digit[4],
            &digit[5],
            &digit[6],
            &digit[7],
            &digit[8],
            &digit[9],
            &digit[10],
            &digit[11],
            &digit[12],
            &digit[13],
            &digit[14],
            &digit[15],
            &digit[16],
            &digit[17],
            &digit[18],
            &digit[19]);                        //NOTHING HAPPENS AFTER HERE

    printf("Got input, number is %d", number); 

    while (count > 0) {
        printf("Reading digits, count is %d", count);
        process_digit(digit[20 - count], position);
        position++;
        count--;
    }

    print_digits_array();
    printf("\n");
    return 0;
}

void clear_digits_array(void) {
    /* fill all positions in digits array with blank spaces */
    for (i = 0; i < 3; i++) {
        for (j = 0; j < (MAX_DIGITS * 4); j++) {
            digits[i][j] = ' ';
        }
    }
}

void process_digit(int digit, int position) {
    /* check each segment to see if segment should be filled in for given digit */
    for (i = 0; i < 7; i++) {
        printf("Processing digit %d at position %d, i is %d", digit, position, i);
        if (segments[digit][i] == 1) {
            switch (i) {
                case 0: digits[0][(position * 4) + 1] = '_';
                        break;
                case 1: digits[1][(position * 4) + 2] = '|';
                        break;
                case 2: digits[2][(position * 4) + 2] = '|';
                        break;
                case 3: digits[2][(position * 4) + 1] = '_';
                        break;
                case 4: digits[2][(position * 4) + 0] = '|';
                        break;
                case 5: digits[1][(position * 4) + 0] = '|';
                        break;
                case 6: digits[1][(position * 4) + 1] = '_';
                        break;
            }
        }
    }
}

void print_digits_array(void) {
    /* print each character in digits array */
    for (i = 0; i < 3; i++) {
        for (j = 0; j < (MAX_DIGITS * 4); j++) {
            printf("%c", digits[i][j]);
        }
        printf("/n");
    }
}
4

3 回答 3

2

您的代码包括:

printf("Enter a number: ");

int number = scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",
        &digit[0],
        &digit[1],
        &digit[2],
        &digit[3],
        &digit[4],
        &digit[5],
        &digit[6],
        &digit[7],
        &digit[8],
        &digit[9],
        &digit[10],
        &digit[11],
        &digit[12],
        &digit[13],
        &digit[14],
        &digit[15],
        &digit[16],
        &digit[17],
        &digit[18],
        &digit[19]);                        //NOTHING HAPPENS AFTER HERE

您输入了二十个不同的数字吗?如果没有,scanf()正在等待您输入更多数字。

请注意, from 的返回值scanf()是成功转换的数字的数量(示例中为 0..20),而不是您输入的值。


是这个问题吗?我试图使用户可以输入的最大数字数量为 20,如果输入更多,它们将被忽略,或者如果输入更少,它只会考虑那些(比如,输入 5,那么只有5将被使用)。那么有没有更简单的方法来做这种事情呢?

是的,我认为这就是问题所在。

可能有几种更简单的方法可以做到这一点。我很想使用:

char buffer[22];  // 20 digits, newline, null
if (fgets(buffer, sizeof(buffer), stdin) != EOF)
{
    size_t len = strlen(buffer);
    if (len >= sizeof(buffer) - 1)
    {
        fprintf(stderr, "You entered too long a string (maximum 20 digits)\n");
        exit(EXIT_FAILURE);
    }
    if (len > 0)
        buffer[--len] = '\0';  // Zap newline — carefully
    for (int i = 0; i < len; i++)
    {
        if (!isdigit(buffer[i]))
        {
            fprintf(stderr, "Non-digit %c found\n", buffer[i]);
            exit(EXIT_FAILURE);
        }
    }
    ...and from here, process the digits in buffer, one at a time...
    ...Use buffer[i] - '0' to get a number 0..9 from the character in buffer...
}

另一种选择是使用long long数字,但最多只能提供 18 位(有符号)或 19 位(无符号),其中一些值 19 或 20 也在范围内。然后,您将使用除法和模数运算从数字中去除数字。

long long value;
if (scanf("%lld", &value) == 1)
{
    if (value < 0)
        ...error processing...
    do
    {
        int digit = value % 10;
        value /= 10;
        ...process digit...
    } while (value > 0);
}

这有一些优点,但在实践中,我很想用它fgets()来读取一行输入,sscanf()或者 strtoll()转换和验证数字。这并不像看起来那么简单。特别是从 中返回的错误strtoll()很多且微妙,并且没有一个scanf()家族可以优雅地处理溢出的数字。您可以限制scanf()with%18lld以便读取不超过 18 位数字,但这意味着如果用户键入 19 位或更多位,您将在下次尝试读取 with 时得到剩余的数字scanf()。因此,处理scanf()也不简单,特别是如果您需要在一次程序运行中转换多个数字。

排除这些警告后,您通常可以在明智的人提供输入的情况下完成“足够好”的工作。使程序防弹(万无一失,如防傻瓜)的过程是困难的。当我可以报告读入的整个字符串(如fgets())时,我发现有意义的错误报告更容易;使用scanf(),您将看不到在出现问题之前输入和使用的字符。

于 2012-11-28T04:59:16.813 回答
0

使用 GDB,这里是它的介绍http://www.gnu.org/software/gdb/ 查看本教程http://www.cs.cmu.edu/~gilpin/tutorial/

于 2012-11-28T04:58:34.593 回答
0
int number = scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",
            &digit[0],
            &digit[1],
            &digit[2],
            &digit[3],
            &digit[4],
            &digit[5],
            &digit[6],
            &digit[7],
            &digit[8],
            &digit[9],
            &digit[10],
            &digit[11],
            &digit[12],
            &digit[13],
            &digit[14],
            &digit[15],
            &digit[16],
            &digit[17],
            &digit[18],
            &digit[19]);         

我不认为这是一个好主意loop在这里使用

for (i = 0; i < 20; i++) 
        scanf("%d",&digit[i]);

如果你需要number 然后这样做

int number = i;当循环结束时。

你也可以试试这个

char buf[12]; 
while((c=getchar())!=EOF && i < 20)
{
 buf[j++] =c;
 if((c == '\n' || c == ' ' || c == '\t') && (sscanf(buf,"%d",&digit[i])) == 1)
   {
    i++;
    j = 0;
   }
 }

对于 EOF 你将不得不按CTRL+D 这种方式你可以取 20 或更少的整数

于 2012-11-28T05:01:35.997 回答