Problem z getchar – błąd ze strony ustawień VS?

0
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
int main(void)
{
	char odp;
	printf("2+2=?\na)o\nb)1\nc)4\nd)5\n");
	odp = getchar();
	if (isalpha(odp)) {
		odp = tolower(odp);
		if (odp == 'c')
		{
			printf("Wygrales 500\n");
			printf("Co jest stolica Polski?\na)Krakow\nb)Łodz\nc)Wroclaw\nd)Warszawa\n");
			fflush(stdin);
			odp = getchar();
			odp = tolower(odp);
			if (odp == 'd')
			{
				printf("Wygrales 1000zl\n");
				printf("Jaka rzeka plynie przez Warszawe?\na)Wisla\nb)Odra\nc)Baltyk\nd)Tamiza\n");
				fflush(stdin);
				odp = getchar();
				odp = tolower(odp);
				if (odp == 'a')
				{
					printf("Wygrales 5000zl\n");
					printf("Co znaczy window po angielsku?\na)drzwi\nb)okno\nc)sufit\nd)podloga\n");
					fflush(stdin);
				}
				else printf("Wygrales 1000zl\n");
			}
			else printf("Nic nie wygrales\n");
		}
		else printf("Nic nie wygrales\n");
	}
	system("pause");
	return 0;
}

Odpowiadając na pierwsze pytania, czyli naciskając "c" wyrażenie jest prawdziwe, lecz nie mogę przejść do następnego pytania. Od razu wyświetla się mi ''press any key to continue''. Co ciekawe taka sytuacja jest u mnie na laptopie. Na szkolnym komputerze program działał. Plik jest ten sam bo wysyłałem go sobie na pocztę. Czy błąd może być ze strony ustawień VS?

PS Nie patrzcie na ostatni warunek, jest on nie dokończony

1

jestem przeciwnikiem wywołań w rodzaju system("cls"); czy system("pause").
To są wywołania podrzędnych procesów (jednego lub dwóch)

Nie masz pętli, to nie wykonuje się w pętli. Jak zewnętzrenego if'a obstawisz pętlą, to będzie mniej więcej to, o czym myślisz.

0

Właśnie szczegół w tym, że to zadanie ma być zrobione bez użycia pętli... taki wymóg prowadzącego.

0
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>


int main(void)
{
        char a = '\0';
        printf("What is your answer?\n");
        scanf("%c", &a);

        printf("\n Your answer is: %c\n", a);

        if (a == 'a') {
                printf("Yeah! It's correct answer\n");
        } else {
                printf(":'( Loooser\n");
        }

        return 0;
}


0

No tyle to mam, tylko że druga instrukcja warunkowa nie działa. Podobnie jest tutaj, program ma obliczać pole trójkąta na kilka sposobów. Nie da się podać pierwszej litery 'r' lub 's' przy wyborze, czy mająto być radiany czy stopnie. Program wtedy kończy swoje działanie....

#include<stdio.h>
#include<ctype.h>
int main()
{
	printf("Obliczmy pole trojkata. Ktory chcesz wybrac sposob?\n1)bok i wysokosc\n2)dwa boki i kat\n3)trzy boki");
	int wybor;
	float bok, wysokosc, bok2;
	char wybor2;
	scanf("%d", &wybor);
	switch (wybor)
	{
	case 1:
		printf("Podaj bok: ");
		scanf("%f", &bok);
		printf("Podaj wysokosc");
		scanf("%f", &wysokosc);
		printf("(%f*%f)/2=%f", wysokosc, bok, (wysokosc*bok) / 2);
		break;
	case 2:
		printf("Podaj pierwszy bok: ");
		scanf("%f", &bok);
		printf("Podaj drugi bok: ");
		scanf("%f", &bok2);
		printf("Wolisz stopnie czy radiany, podaj pierwsza liter: ");
		scanf("%c", &wybor2);
		switch (wybor2)
			case 'r':
				printf("ok");
	}
	system("pause");
	return 0;
}
0

Ma ktoś jakiś pomysł co to może być?

0

Jesli enterem akceptujesz input to ten enter zostaje w buforze STDIN. Musisz go wyczyscin ihmo NIE MA miedzysystemowej funkcji dla tego.
Najlatwiej zczytac do tymczasowej zmiennej wszystko z stdin przed kazdym zamiarem wczytania chara z stdin.

Pod linia:

        rintf("Wolisz stopnie czy radiany, podaj pierwsza liter: ");

dodaj

        int ch; while ((ch = getchar()) != '\n' && ch != EOF);

Ewentualnie napisz sobie prosta funkcje

void getChar(char *variableAddr) {
    int ch; while ((ch = getchar()) != '\n' && ch != EOF);
    scanf("%c", variableAddr);
}

i uzywaj jej

        scanf("%f", &bok2);
        printf("Wolisz stopnie czy radiany, podaj pierwsza liter: ");
        getChar(&wybor2);
3

Działanie funkcji getchar() jest bardzo mylące.
To nie jest zastępnik na przykład dla _getch().

getchar wykonane na konsoli (czyli kiedy standardowym wejściem jest klawiatura, a nie jakiś plik, potok itp.) pobiera jeden znak z bufora klawiatury.
Jeśli ten bufor jest pusty, to pozwala na wpisanie linii tekstu zatwierdzonej enterem.
Kolejne wywołania getchar zwracają po jednym znaku z tego bufora.

Jeśli wpisujesz literę i naciskasz enter, to ten getchar zwróci ci literę, a następny getchar zwróci ci kod entera, bez czekania na cokolwiek.

Najprostszym rozwiązaniem pod Visualem jest <conio.h> i funkcje _getch(), _getche(). To prawda, nie są one w standardzie C ani C++, ale standard w tym temacie jest po prostu do kitu.

2
int isValidAnswear(char ch)
{
    ch = tolower(ch);
    return ch == 'a' || ch == 'b' || ch == 'c' || ch == 'd';
}

char ch = 0;
while (0 == scanf("%c", &ch) || !isValidAnswear(ch))
{
    scanf("%*[^\n]"); // ignoruj wszystko do znaku końca linii
    printf("Please select valid answear: a, b, c, d\n");
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1