gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:22:41 26 4
gpt4 key购买 nike

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

#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");
}
}

最佳答案

您的代码包括:

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),而不是您输入的值。

<小时/>

Is that the issue? I tried to make it such that the maximum amount of numbers the user could enter was 20, and if any more were entered they would be ignored, or if fewer were entered, it would only consider those (say, 5 were entered, then only the 5 would be used). Is there an easier way to do this sort of thing then?

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

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

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() 系列中没有一个能够优雅地处理溢出的数字。您可以使用 %18lld 来限制 scanf() ,以便读取的数字不超过 18 个,但这意味着如果用户输入 19 个或更多数字,您将下次尝试使用 scanf() 读取时会得到剩余的内容。因此,处理 scanf() 也并不简单,特别是当您需要在程序的单次运行中转换多个数字时。

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

关于C 程序未按预期运行,输入后挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13598069/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com