#c #c99
#c #с99 #c99
Вопрос:
Я создаю меню для игры, и когда я тестирую программу и ввожу символ или строку, программа будет использовать значение по умолчанию, которое кажется вечным,
Я пытался использовать функцию strcmp (x, y), однако, похоже, у меня это не работает.
int main(void) {
int run = 1;
int choice;
do
{
printf("options: n1. foo n2.Bar n");
scanf("%d", amp;choice")
switch (choice) {
case 1: printf("hello world n");
break;
case 2: printf("Hello World n");
break;
default: printf("enter a valid option");
break;
}
} while (run == 1);
return 0;
}
Комментарии:
1. После того, как вы напечатаете вопрос, вы должны получить входные данные. Использовать
scanf("%d", amp;choice)
Ответ №1:
Как сказано в замечании, вы никогда не устанавливаете выбор, поэтому его значение не определено, а его использование — неопределенное поведение
например, заменить
printf("options: n1. foo n2.Bar n");
Автор:
printf("options: n1. foo n2.Bar n");
if (scanf("%d", amp;choice) != 1) {
/* not an integer, byppass all up to the newline */
int c;
while ((c = getchar()) != 'n') {
if (c == EOF) {
fprintf(stderr, "EOF");
return -1;
}
}
choice = -1;
}
или более простое получение символа, а не int :
char choice;
...
printf("options: n1. foo n2.Bar n");
if (scanf(" %c", amp;choice) != 1) {
fprintf(stderr, "EOF");
return -1;
}
...
case '1':
...
case '2':
...
обратите внимание на пробел перед %c
, чтобы обойти пробелы и новые строки, в этом случае, конечно, замените case 1
на case '1'
и case 2
на case '2'
Всегда проверяйте результат scanf если вы просто делаете scanf("%d", amp;choice);
, а пользователь не вводит число, ваша программа будет зацикливаться без завершения запроса выбора и указания ошибки, больше ввода не будет получено, потому что не номер не обходится, поэтому scanf будет получать его все время.
Обратите также внимание
- оба варианта 1 и 2 выполняют
printf("hello world n")
- run никогда не изменяется, поэтому
do ... while (run == 1);
не может завершиться, возможно, вы хотели установить для run значение 0 (я имею в виду значение ! = 1) для случаев 1 и 2?
Пример :
#include <stdio.h>
int main(void) {
int run;
char choice;
do
{
run = 0;
puts("options:n 1. foo n 2. Bar");
if (scanf(" %c", amp;choice) != 1) {
fprintf(stderr, "EOF");
return -1;
}
switch (choice) {
case '1':
printf("hello foon");
break;
case 2:
printf("Hello bar n");
break;
default:
run = 1;
puts("enter a valid option");
break;
}
} while (run == 1);
printf("all done with choice %cn", choice);
return 0;
}
Компиляция и выполнение :
pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out
options:
1. foo
2. Bar
a
enter a valid option
options:
1. foo
2. Bar
33
enter a valid option
options:
1. foo
2. Bar
enter a valid option
options:
1. foo
2. Bar
1
hello foo
all done with choice 1
pi@raspberrypi:/tmp $
Комментарии:
1. Добавлена функция сканирования
Ответ №2:
Вы должны добавить оператор scanf после печати «Параметры: …»
#include <stdio.h>
int main(void) {
int run = 1;
int choice;
do{
printf("options: n1. foo n2.Bar n");
scanf("%d", amp;choice);
switch (choice) {
case 1:
printf("hello world n");
break;
case 2:
printf("Hello World n");
break;
default:
printf("enter a valid optionn");
break;
}
}while (run == 1);
return 0;
}
Если вам нужно проверить, является ли введенное значение цифрой, вы можете использовать isdigit()
функцию.
Комментарии:
1. вы путаете 1 и 2 с ‘1’ и ‘2’, и если вы хотите ввести цифру, лучше сделать
scanf(" %c", amp;choice)
, а не scanf с%d
2. да, но вопрос касается целых чисел, поэтому я ответил %d
3. Пожалуйста, никогда не предлагайте решение для получения целого числа с помощью scanf без проверки возвращаемого значения, просто запустите свою программу и введите что-то еще, кроме числа…