[C] pomijanie reszty wiersza danych wejściowych

0

To ma być program to zgadywania liczb, obliczenie są źle ale nie oto mi chodzi, chodzi mi o te fragmenty

while(getchar()!='\n')
		{
			continue;
		}

jak to się dzieje że jak nawet wpisze cały wyraz pomija resztę znaków, i zajmuje sie tylko tym pierwszym, niemego tego zrozumieć

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

int main(void)
{
	int x, y=100, z, g;	
	
	printf("wybie liczbe od 1 do %d:\n", y);
	printf("wpisz \'t\' jesli zgadlem lub \'n\' jak niezgadlem\n");
	z=y/2;
	printf("cz jest to %d?\n", z);
	while((x=getchar())!='t')
	{
		while(getchar()!='\n')
		{
			continue;
		}
		printf("czy jes to liczba większa od %d\n", z);
		if((g=getchar())=='t')
		{
			z=(y+z)/2;
			printf("Czy jest to %d\n", z);
		}
		else
		{
			z=(y-z)/2;
			printf("Czy jest to %d\n", z);
		}
		while(getchar()!='\n')
		{
			continue;
		}
	}
	system("pause");
	return 0;

}

0

scanf("%*[^\n]");

0

co??

0

źle przeczytałem pytanie...
po wpisaniu wyrazu cały wyraz wraz z enterem znajduje się na wejściu, funkcja getchar() odczytuje dokładnie jeden znak z wejścia.
załóżmy, że wpisałeś na wejściu (enter zaznaczyłem \n):
tak\n
po pierwszy wywołaniu getchar(), w tej linii:

while((x=getchar())!='t')

z wejścia zostaje zabrany pierwszy znak i zwrócony, na wejściu zostaje zatem:
ak\n
i tak z każdym kolejnym wywołaniem.

Fragment:

while(getchar()!='\n')
  {
    continue;
  }

jest może trochę dziwnie zapisany, bo te continue w tej pętli w zasadzie nic nie robi i równie dobrze można by ją zapisać tak:

while(getchar()!='\n');//<--zwróc uwagę na średnik

pętla ta zczytuje znak po znaku wejścia aż do natrafienia znaku końca linii.

zwróć również uwagę na to, że w przypadku wywołania dowolnej funkcji odczytującej coś z wejścia i natrafienia przez tą funkcję wejścia które jest puste (lub niepełnego - np. brak entera na wejściu w przypadku funkcji odczytującej całą linię) konsola czeka na wpisanie całej linii i dopiero potem kontynuowany jest program.

0

nie rozumie, zrozumiałem tylko że jak wpisuje tak\n, to analizuje znak po znaku, ale dlaczego pomija analizy reszty znaków to już nie.

0

nigdzie nic nie jest pomijane. nie rozumiem Twojego problemu.

0

więc
program bez zmiany kodu:
image jpg 1455-131
po wywaleniu ty 2 części

while(getchar()!='\n')
		{
			continue;
		}

image jpg 1455-132

dlaczego tak sie dzieje

0

Mogę liczyć na pomoc??

0

napisałem że nie mogę tego zrozumieć i dalej tak jest jak.

0

wydaje mi się, że prościej już się nie da wyjaśnić.

0

w tym co zastało napisane, nie widzę dlaczego ten program działa ok, anie tak jak na drugim obrazku jak dla mnie oba kody powinny działać tak samo czyli jak na drugim obrazku.
może najlepiej krok po kroku jak to działa

0

a tak w ogóle to wiesz jak pętla while działa?

0
while((x=getchar())!='t')
        {
                while(getchar()!='\n')
                {
                        continue;
                }

wpisuje nie i daje enter

pobiera n
n!=t prawda wiec idzie dalej
potem n!=\n prawda idzie dalej
continue mówi o następnej kolejce pętli while
i dalej sprawdza n!=\n
prawda i robi to w nieskończoność
ja to tak widzę
jak by to było takie oczywiste jak to działa to bym się z tym nie odzywał
while(getchar()!='\n') to jest według mnie niepotrzebne.

0

getchar() pobiera znak z wejścia, jednocześnie usuwając go ze strumienia. Dlatego pierwszy znak w drugiej pętli z Twojego ostatniego postu jaki będzie rozpatrywany to 'i'.

0

spróbuj sobie coś takiego odpalić i zobacz co się dzieje:

while (1)
{
  char c = getchar();
  printf("znak [%c], ACII: %d\n",c,(int)c);
}
1
while((x=getchar())!='t')
        {
                while(getchar()!='\n')
                {
                        continue;
                }

Czyli działa to tak że jak pisze nie[enter]
to x=getchar() pobiera n
i zostaje ie[enter]
potem getchar() pobiera to co zostało czyli i
następnie e no i \n
pętla while usuwa te znaki ze strumienia stdin(tak sie chyba nazywa)
przez co potem operuje tylko na pierwszym znaku

0

toż tak od samego początku pisałem

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