我在reddit上发现了一些挑战,希望编写一个程序来汇总所有DnD骰子掷骰。抛出次数不受限制,因此我创建了while循环。
我使用fgets输入字符串,(我不能只输入整数,因为输入例如是1d3,其中1是抛出的骰子数量,而3是抛出的骰子的边数。)
当提示用户输入骰子时,fgets永远不会停止读取用户输入。
例如:
To end inputting dice type 0
1d3
1d4
1d5
0
0
^C
主要功能:
int main(void)
{
char input[MAXSIZE];
int sum = 0;
printf("To end inputting dice type 0\n");
while(*(input) != 0);
{
fgets(input, sizeof(input), stdin);
printf("Debug: input = ");
puts(input);
printf("\n");
sum += dice(input);
printf("Debug: sum = %d\n", sum);
}
printf("Sum of dice rolls is %d.", sum);
return 0;
}
答案 0 :(得分:3)
首先,字符输入0
的字面值不是0
。在ASCII中,它是48(十进制)。
尝试
while(*(input) != '0') // (1) - use the character literal form
// (2) remove the ;
也就是说standard output is usually line buffered。如果要在终端中查看输出,则需要强制刷新。您可以通过
添加换行符
printf("Debug: input = \n");
fflush(stdout)
。答案 1 :(得分:1)
尝试一下:-
Workbooks("AnotherWorkbook.xlsx").Sheets(1).row(1).delete
或
while(fgets(input, sizeof input, stdin) != NULL)
答案 2 :(得分:1)
这个问题真的很简单,这样的初学者错误甚至问到这个问题我都感到羞耻。
while循环后的分号。
谢谢大家的帮助。
答案 3 :(得分:0)
char input[MAXSIZE] = { 0 }; // initialise input!
// otherwise you get to here and access an uninitialised variable:
while(*(input) != 0); // <--- and a semicolon right there!!! Remove that!
实际上,我认为您想要的循环是while (fgets(input, sizeof input, stdin) && strcmp(input, "0\n"))
...请注意,我已经将fgets
提升到了循环控制表达式中。
例如,您可能应该在调用fgets
之后进行检查,以确保读取了换行符
while (fgets(input, sizeof input, stdin) && strcmp(input, "0\n")) {
size_t n = strcspn(input, "\n");
if (input[n] == '\n') input[n] = '\0';
else assert(input[n] == '\0'), // #include <assert.h>
fscanf(stdin, "%*[^\n]"),
fgetc(stdin);
使用fscanf
时,没有与读取无符号整数相关的未定义行为,因此,如果仅计划使用正值,则可以使用fgets
代替unsigned dice_count, dice_sides;
while (fscanf(stdin, "%ud%u", &dice_count, &dice_sides) == 2) {
printf("You chose to roll %u times with dice that contain %u sides\n", dice_count, dice_sides);
}
,即
Call DB Procedure