В VSC мое if было пропущено и сразу перешло к условию else. Вот код, спасибо за помощь ;-;
#include <stdio.h>
#include <ctype.h>
int main()
{
char questions[][100] = {"1. What is Nanook Path?",
"2. Who fixed the Astral Express?",
"3. What is Firefly's armor type?"};
char options[][100] = {"A. Abundance", "B. The Hunt", "C. Destruction", "D. Preservation",
"A. Himeko", "B. Welt", "C. Pom Pom", "D. Me obviously",
"A. Type IX", "B. Type IV", "C. Type V", "D. PType VI"};
int numberofquestions = sizeof(questions)/sizeof(questions[0]);
char answers[] = {'C', 'A', 'B'};
char guess;
int score = numberofquestions;
for (int i = 0; i < numberofquestions; i++)
{
printf("%s\n", questions[i]);
for(int j = i * 4; j < i * 4 + 4; j++)
{
printf("%s\n", options[j]);
}
printf("Enter your guess:");
scanf("%c", &guess);
scanf("%c"); //clear \n character from input buffer
guess = toupper(guess);
if (guess == answers[i])
{
printf("Correct!!\n");
}
else
{
printf("Wronggg!!!\n");
score--;
}
}
printf("%d", score);
return 0;
}
Я попробовал код в онлайн-компиляторе C, и он работает отлично. Я также попробовал сбросить VSC, но все равно не работает.
все еще не работает" - надо быть более конкретным.
Добро пожаловать в СО. Вы можете использовать scanf(" %c", &guess);
, чтобы пропустить ведущие пробелы.
Вам следует запустить программу в отладчике и просмотреть каждую строку. Следите за содержимым ваших переменных. Содержит ли guess
то, что вы ожидаете? То же самое и с i
.
@Gerhardh Думаю, ты мог бы опубликовать это как ответ на вопрос.
@Лундин, правда, я сделал это. Спасибо за подсказку. Во время набора текста оно оказалось длиннее, чем ожидалось. ;)
Ваш код вызывает неопределенное поведение:
scanf("%c");
Вы должны предоставить соответствующий аргумент для каждого спецификатора формата. В этом случае вы должны указать адрес считываемого символа.
В противном случае вызывается неопределенное поведение, и в принципе может случиться что угодно.
В этом случае функция, вероятно, возьмет все, что найдет в месте, где должен храниться адрес, и будет использовать это для сохранения данных.
Это может быть переменная, которую вы использовали в прошлый раз при вызове scanf
, т. е. guess
, или какая-то соседняя переменная, или любое другое место.
Или он может сделать что-то совершенно другое.
Тем не менее, любой недавний компилятор хорошо знает о вашей ошибке. И я ожидаю, что вы получите предупреждение об этом.
Если вы не получили предупреждение, вам необходимо провернуть уровень предупреждения. Для gcc или clang вам следует использовать опции -Wall -Wextra -pedantic
.
Если вы получили предупреждение, вы не должны были его игнорировать. Компилятор обычно знает, о чем говорит.
Если я запущу ваш код через gcc, я получу этот вывод уже без каких-либо дополнительных опций:
$ gcc test.c -o test
test.c: In function ‘main’:
test.c:27:17: warning: format ‘%c’ expects a matching ‘char *’ argument [-Wformat=]
27 | scanf("%c"); //clear \n character from input buffer
| ~^
| |
| char *
А если я его запущу (не исправляя), то получу Correct!!
за правильные ответы.
Это природа неопределенного поведения. Он может отличаться от машины к машине.
Какие данные вы предоставили при тестировании?