Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序未按预期运行,输入后挂起_C_Arrays_User Input - Fatal编程技术网

C程序未按预期运行,输入后挂起

C程序未按预期运行,输入后挂起,c,arrays,user-input,C,Arrays,User Input,我正在编写一个程序,以获取一个数字,并将其显示为计算器将显示的数字(如下所示),该程序编译时没有问题,但当我尝试运行它时,我能够输入我的数字,但什么也没有发生。它看起来像是“挂起”,因为没有像我预期的那样显示进一步的输出。有谁知道问题出在哪里吗 #include <stdio.h> #define MAX_DIGITS 20 char segments[10][7] = /* seven segment array */ {{'1','1','1'

我正在编写一个程序,以获取一个数字,并将其显示为计算器将显示的数字(如下所示),该程序编译时没有问题,但当我尝试运行它时,我能够输入我的数字,但什么也没有发生。它看起来像是“挂起”,因为没有像我预期的那样显示进一步的输出。有谁知道问题出在哪里吗

#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");
    }
}
#包括
#定义最大数字20
字符段[10][7]=/*七段数组*/
{{'1','1','1','1','1','1','1','0'},/*0*/
{'0','1','1','0','0','0','0'},/*1*/
{'1','1','0','1','1','0','1'},/*2*/
{'1','1','1','1','0','0','1'},/*3*/
{'0','1','1','0','0','1','1'},/*4*/
{'1','0','1','1','0','1','1','1'},/*5*/
{'1','0','1','1','1','1','1','1'},/*6*/
{'1','1','1','0','0','0','0'},/*7*/
{'1','1','1','1','1','1','1','1'},/*8*/
{'1','1','1','0','0','1','1'}};/* 九*/
字符位数[3][MAX_digits*4];/*数字数组*/
int i,j;/*计数变量*/
整数调整;/*输出格式*/
内部主(空){
清除数字数组();
整数位数[20];
对于(i=0;i<20;i++){
数字[i]=0;
}
整数计数=20;
int位置=0;
printf(“输入一个数字:”);
int number=scanf(“%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d”,
&数字[0],
&数字[1],
&数字[2],
&数字[3],
&数字[4],
&数字[5],
&数字[6],
&数字[7],
&数字[8],
&数字[9],
&数字[10],
&数字[11],
&数字[12],
&数字[13],
&数字[14],
&数字[15],
&数字[16],
&数字[17],
&数字[18],
&数字[19]);//在此之后不会发生任何事情
printf(“已获得输入,编号为%d”,编号);
而(计数>0){
printf(“读取数字,计数为%d”,计数);
过程数字(数字[20-计数],位置);
位置++;
计数--;
}
打印数字数组();
printf(“\n”);
返回0;
}
无效清除\u数字\u数组(无效){
/*用空格填充数字数组中的所有位置*/
对于(i=0;i<3;i++){
对于(j=0;j<(最大位数*4);j++){
数字[i][j]='';
}
}
}
无效进程\u位(整数位,整数位置){
/*检查每个段,查看是否应为给定数字填写段*/
对于(i=0;i<7;i++){
printf(“在位置%d处处理数字%d,i为%d”,数字,位置,i);
如果(段[位][i]==1){
开关(一){
第0种情况:数字[0][(位置*4)+1]='';
打破
案例1:数字[1][(位置*4)+2]='|';
打破
案例2:数字[2][(位置*4)+2]='|';
打破
案例3:数字[2][(位置*4)+1]='u';
打破
案例4:数字[2][(位置*4)+0]='|';
打破
案例5:数字[1][(位置*4)+0]='|';
打破
案例6:数字[1][(位置*4)+1]='';
打破
}
}
}
}
作废打印\数字\数组(作废){
/*以数字数组打印每个字符*/
对于(i=0;i<3;i++){
对于(j=0;j<(最大位数*4);j++){
printf(“%c”,数字[i][j]);
}
printf(“/n”);
}
}

使用GDB,下面是它的介绍 查看本教程

您的代码包括:

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()
将等待您键入更多数字

请注意,
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...
}
这有一些优点,但在实践中,我会尝试使用
fgets()
读取一行输入,并使用
sscanf()
strtoll()
转换和验证数字。这并不像看上去那么简单;特别是,从
strtoll()
返回的错误非常多且微妙,而且
scanf()
系列中没有一个能够优雅地处理溢出的数字。您可以使用
%18lld
约束
scanf()
,使读取的数字不超过18位,但这意味着如果用户键入19位或更多数字,您将在下次尝试使用
scanf()
读取时得到剩余数字。因此,处理
scanf()
也不简单,特别是当您需要在一次程序运行中转换多个数字时

有了这些警告,你通常可以在一个明智的人提供意见的情况下做一件“足够好”的工作。制作一个防炸弹的程序(万无一失——例如,防愚人)是很难的。当我可以报告读入的整个字符串时(如
fgets()
),我发现有意义的错误报告更容易;使用
scanf()
,您无法看到在出现问题之前输入和使用的字符

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]);
对于EOF,您必须按
CTRL+D

用这种方法你可以得到20个或更少的整数

这就是问题所在吗?我努力使它成功
for (i = 0; i < 20; i++) 
        scanf("%d",&digit[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;
   }
 }