Как сказано в замечании, вы никогда не устанавливаете choice , поэтому его значение не определено и его использование не определено
например заменить
printf("options: \n1. foo \n2.Bar \n");
от
printf("options: \n1. foo \n2.Bar \n");
if (scanf("%d", &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", &choice) != 1) {
fprintf(stderr, "EOF");
return -1;
}
...
case '1':
...
case '2':
...
обратите внимание на пробел перед %c
, чтобы пропустить пробелы и символы новой строки, в этом случае, конечно, замените case 1
на case '1'
и case 2
на case '2'
Всегда проверьте результат scanf , если вы просто наберете scanf("%d", &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", &choice) != 1) {
fprintf(stderr, "EOF");
return -1;
}
switch (choice) {
case '1':
printf("hello foo\n");
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 %c\n", 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 $