我正在编写的程序拿一个数字并显示该数字作为计算器显示它(如下所示)正在编译没有问题,但当我尝试运行它时,我能够输入我的数字,但没有发生。它似乎是“悬挂”,因为没有显示出我预期的进一步输出。可能有人知道问题是什么?
#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");
}
}
答案 0 :(得分: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()
正在等待您输入更多数字。
请注意,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()
约束%18lld
,以便读取不超过18位数,但这意味着如果用户输入了19位或更多位数,您将在下次尝试时获得剩余的数字阅读scanf()
。因此,处理scanf()
也不简单,特别是如果您需要在程序的单次运行中转换多个数字。
有了这些警告,你通常可以通过提供意见的明智的人来做一个“足够好”的工作。这是一个制定程序防弹的过程(万无一失 - 如同对傻瓜一样证明)很难。当我可以报告读入的整个字符串时(与fgets()
一样),我发现有意义的错误报告更容易;使用scanf()
,您无法看到在出现问题之前输入和使用的字符。
答案 1 :(得分:0)
使用GDB,这里是它的介绍http://www.gnu.org/software/gdb/ 同时查看本教程http://www.cs.cmu.edu/~gilpin/tutorial/
答案 2 :(得分: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或更少的整数