Wczytywanie danych od użytkownika bez zatwierdzania enterem

0

Witam!

Przeczytałem, tematy znajdujące się na forum, ale nie znalazłem rozwiązania na mój problem dostatecznie łopatologicznie, abym to zrozumiał. Sorry ale jestem początkujący początkującego. Potrzebuję, aby program czytał od użytkownika zmienną (tak jak scanf()) 'type', a gdy już w debuggerze wpisze, to żeby zatwierdził bez wciskania entera. Wiem, że to będzie coś z getchar(), ale nie udało mi się nic wykombinować. Dodam, że używam Visual studio 2010 i oczywiście język C. Korzystając z okazji, kolejne pytanie- czy da radę tablicę np. dwuwymiarową zapisać bez ograniczenia/ bez wpisywania w [][] liczb- tutaj coś z arraylist, list<>, ale nie wiem jak to w strukturze wygląda.

1

Ad 1. Bez wciskania entera nie da się ponieważ tak właśnie działa konsola pod Windows. C nie ma z tym nic wspólnego. Ale można wpisać dwie liczby w jednym wierszu oddzielone spacją lub tabulacja i wczytać je razem: scanf("%d%d",&a,&b);
Ad 2. W C nie ma wzorców ale możesz zorganizować listę nadziewaną która po wczytaniu przekształcisz na tablicę.

0

Stworzyłem sobie takie pseudo poruszanie się po tablicy. Chciałem, żeby po wpisaniu liczby, przesuwał ten mój wektorek, bez wciskania entera, no ale jak się nie da, to się nie da, no ale chciałbym jeszcze zadać pytanie do tego rozwiązania, czy to jest dobre rozwiązanie, czy istnieje jakieś inne lepsze? W sensie, chciałbym żeby ta moja liczba która się 'porusza' wchodziła w interakcje z innymi liczbami

while (type!=5){

		scanf("%d", &type);
		
		if (type==2){
			tab[5+h][5+v]=4;
			h++;
			tab[5+h][5+v]=1;
		}
		if (type==8){
			tab[5+h][5+v]=4;
			h--;
			tab[5+h][5+v]=1;
		}
		if (type==4){
			tab[5+h][5+v]=4;
			v--;
			tab[5+h][5+v]=1;
		}
		if (type==6){
			tab[5+h][5+v]=4;
			v++;
			tab[5+h][5+v]=1;
		}
		system("cls");
	}

h-poziom, v-pion

i jeszcze jedno pytanie, jak zrobić uzależnienie odpowiedzi z czasem? Że na przykład po 2 sekundach bez odpowiedzi (scanf()), konsola po prostu sprawdza jeszcze raz wszystko- taki break scanf() po 2 sekundach?

1

Możesz użyć <conio.h>/ ncurses które zapewniają funkcje getch() - zwracającą ostatnio naciśnięty znak.
Co do określonego czasu - kbhit() tęż z <conio.h>/ ncurses

0

a jak to zapisać, żeby to miało ręce i nogi? :D
próbowałem w warunku ifa wpisać

 
 if (getch(type)==2)
.
.
.

wiem, że ręce można załamać nade mną, przepraszam, ale nie wiem jak to wszystko połączyć, a do tego jeszcze kbhit();

1
char ch=getch();
if(ch=='2') ...
0

jak deklaruję zmienne na początku programu (bo chyba inaczej się nie da- tylko i wyłącznie bezpośrednio pod int main()), to po prostu czyta moje ch=getch() już jako pobieranie danych od użytkownika, a nie w miejscu w którym to powinno działać, czyli w warunkach pętli dla której wartość ch ma być różna od 5. Coś źle robię, pewnie powodem tego jest błędne rozumienie getch()- bo to jest funkcja, która czyta tylko jeden znak, czyli bufor jest zarezerwowany dla jednego znaku, więc nie ma potrzeby wpisywania więcej znaków, skoro jest zapełniony.

0

Odstaw ten projekt i zajmij się czymś prostszym na początek.
Weź przeczytaj pierwszy lepszy kurs C a potem wróć do projektu.

0

Zrobiłem. Tzn błąd mi pokazuje, że zmienna ch jest niezainicjowana, ale jak wybiorę kontynuuj, pomimo błędu, to program działa.

Mimo wszystko dzięki :)

1

No to ją zainicjuj char ch=0;

0

Zrobiłem już to, teraz pytanie jak użyć funkcję kbhit()? Poczytałem trochę i nie o tą funkcję mi chodziło, tzn. chciałem, żeby po pewnym czasie (w którymś języku to było chyba delay(1000)) po prostu opuszczało wprowadzanie danych przez użytkownika (w tym przypadku getch()). Przykład: W pętli program chce aby użytkownik wpisał jakąś liczbę, jeżeli wciągu 2 sekund nie wpisze, to po prostu program leci dalej. Możliwe to jest do wykonania, na tym poziomie? Czy tu już większa znajomość getch() się przydaje?

0

Kolejny raz powtarzam:

Odstaw ten projekt i zajmij się czymś prostszym na początek.
Weź przeczytaj pierwszy lepszy kurs C a potem wróć do projektu.

Chodzi o to że masz zbyt małą wiedzę i doświadczenie aby ze znanych klocków zbudować dwulinijkową konstrukcje:

char ch='#';
for(unsigned tm=clock()+1*CLOCK_PER_SEC;(tm<clock())&&(ch=='#');) if(kbhit()) ch=getch();

Zacznij od prostych rzeczy.

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