• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program po wczytaniu łańcucha znaków nie czeka na wciśnięcie klawisza

Object Storage Arubacloud
0 głosów
729 wizyt
pytanie zadane 22 września 2016 w C i C++ przez Sidzej Użytkownik (850 p.)

Mam problem z poniższym programem.

#include "stdafx.h"
#include <iostream>
#include <string>



using namespace std;


int main()
{
	int i;
	char ch;
	string str;

	while (cin.get(ch) && ch != '@')
		str.push_back(ch);

	cout << endl << str;


	cin.ignore();
	cin.get();
	return 0;
}

Program ma za zadanie wczytywanie ciągu znaków aż do znaku "@" a następnie wyświetlenie tego co wczytal. Niby działa poprawnie, ale problem pojawia się kiedy po wpisaniu "@" wpisze jeszcze inne znaki i dopiero zatwierdzę enterem. Wtedy wykonuje to co ma do wykonania i od razu się wyłącza bez czekania na znak. Próbowałem z cin.sync(), cin.clear(), wstawiać to do pętli itd, ale nic nie działa. Proszę o pomoc.

komentarz 22 września 2016 przez DragonCoder Nałogowiec (36,500 p.)
<czy to jest ten program, bo jk tak to chyba raczej nie zadziala nic....
komentarz 22 września 2016 przez Sidzej Użytkownik (850 p.)
Tak, to ten program. U mnie działa tak jak napisałem wyżej.
komentarz 22 września 2016 przez DragonCoder Nałogowiec (36,500 p.)
Czyli nic nie ma w petli, nie wczytujesz slowa.... ok
komentarz 22 września 2016 przez Sidzej Użytkownik (850 p.)

załączam screena z działania

komentarz 22 września 2016 przez Sidzej Użytkownik (850 p.)
Spróbuj sobie odpalić u siebie
komentarz 22 września 2016 przez DragonCoder Nałogowiec (36,500 p.)

Nie mowie ze nie, ale jak dla mnie to raczej nie dziala tak jak trzeba... Chociaz znawca nie jest ale :

#include "stdafx.h"
#include <iostream>
#include <string>
 
 
 
using namespace std;
 
 
int main()
{
    int i;
    char ch;
    string str;
 
    while (cin.get(ch) && ch != '@')
//{
//cin>>str;
//}
        str.push_back(ch);
 
    cout << endl << str;
 
 
    cin.ignore();
    cin.get();
    return 0;
}

Moze jakos tak, to zalezy co ma sie w petli w tym czasie powtarzac

komentarz 22 września 2016 przez Sidzej Użytkownik (850 p.)
Nie działa. Bo nie chodzi o to, że jest problem z samym działaniem. Tylko to, co wpisze już po "@" chyba zostaje w strumieniu i cin.get() zamiast czekać na enter wczytuje te pozostałe dane i program sie kończy i cin.ignore() ani clear/sync na to nie działają
komentarz 22 września 2016 przez Sidzej Użytkownik (850 p.)
to wczytywanie znaków już jest jakby zawarte w pętli. dalem tam tylko ten pushback żeby mi to zapisywało do stringa a nie do tablicy char, bo w stringu mam "nieograniczoną" ilosc miejsca
komentarz 22 września 2016 przez Sidzej Użytkownik (850 p.)
Swoją drogą jakbyś miał jakiś lepszy pomysł na taki program, to mógłbyś się nim podzielić :)
komentarz 22 września 2016 przez DragonCoder Nałogowiec (36,500 p.)

Tak wpisuje i pozniej po wcisnieciu @ wyskakuje mi wszystko co napisales a program sie konczy bo to jego zadanie.... Ale patrz zrobilem tylko jedna petle i po wcisnieciu @ moge dalej pisac a na koniec od nowa wyskoczy mi to co napisalem... 

 

#include <iostream>
#include <string>
#include <cstdlib>


using namespace std;


int main()
{
    for(;;)
    {
system("cls");
    int i;
    char ch;
    string str;

    while (cin.get(ch) && ch != '@')

        str.push_back(ch);

    cout << endl << str;


    cin.ignore();
    cin.get();
    }
    return 0;
}

 

komentarz 22 września 2016 przez DragonCoder Nałogowiec (36,500 p.)
A tak nawiasem mowiac, to pozniej poznasz dynamiczna alokacje pamieci i wtedy char nie bedzie az taki zly, bo nie bedziesz musial z gory okreslic np 1000000 miejsc w tablicy
komentarz 22 września 2016 przez Sidzej Użytkownik (850 p.)
Chodzi mi właśnie o to, że jak napisze powiedzmy "dasdnasi djsaid mdosa@ mdsad" i zatwierdze enterem, żeby okienko mi sie od razu nie zamykało  tylko program czekał z zamknięciem, az nacisne drugi raz enter. jak napisze "dsadsha dsa@", czyli kiedy małpa jest ostatnia, nie ma z tym problemu. Jak sobie odpalilem ten twój kod to rzeczywiście okienko sie nie zamyka ale czyści mi cały ekran. U ciebie tak sie nie dzieje?
komentarz 22 września 2016 przez Sidzej Użytkownik (850 p.)
A brak przymusu określania z góry rozmiaru tablicy charowej to rzeczywiście byłaby dobra sprawa
komentarz 22 września 2016 przez DragonCoder Nałogowiec (36,500 p.)
Tak: <bo dalej taka funkcje, bo to estetyczniej wyglada niz na ekranie wszystko zostanie :D. <usun funkcje system ("cls"); i pomoze ale wtedy na koniec dodaj 2 razy cout<<"\n";
komentarz 22 września 2016 przez DragonCoder Nałogowiec (36,500 p.)
Tak tylko zapytam, po co i do czego bedzie ten program?  Bo to raczej chyba tylko mala czesc czegos wiekszego
komentarz 22 września 2016 przez Sidzej Użytkownik (850 p.)

jesli to można nazwać czymś "większym" xd

#include "stdafx.h"
#include <iostream>
#include <string>
#include <cctype>


using namespace std;


int main()
{
	int i;
	char ch;
	string str;

		while (cin.get(ch) && ch != '@')
		str.push_back(ch);

	




	
	for (i = 0; i < str.size(); i++)
	{
		if (isdigit(str[i]))
			continue;

		if (islower(str[i]))
		{
		
			cout << (char)(str[i] - 32);
				
			continue;
		}

		if (isupper(str[i]))
		{
			cout << (char)(str[i] + 32);
			continue;
		}

		cout << str[i];
	}
	
	
	cin.ignore();
	cin.get();
	return 0;
}

to jest jedno z zadań z książki. chodziło generalnie o to że podaje ten ciąg znaków i program mi zamienia małe litery na duże i na odwrót oraz pomija cyfry. wrzucałem tez pytanie dotyczące tego wczoraj. Dzisiaj jak robiłem coś podobnego, to zdałem sobie sprawę z tego że właśne jak po małpie coś jeszcze napisze i dopiero zatwierdzę to mi się od razu okienko wyłącza. dlatego do tego wróciłem

komentarz 22 września 2016 przez DragonCoder Nałogowiec (36,500 p.)
Aha, widze ze juz tolower masz no to tylko musisz tam poszukac, bo wiesz jest taki maly myk, ze jezeli robisz w stringu to troche slabo... Lepiej jak masz tablice i w tablicy szukasz tych cyfr jak jest to wyrzucasz ja i zostawiasz tylko litery, a na koncu mieniasz je na wielkie. Czyli krotko:

1. Filtr

2. Zmiana

3. Wyswietlic
komentarz 22 września 2016 przez Sidzej Użytkownik (850 p.)
I rzeczywiście, jak zostawię samą pętlę for to działa tak, jak powinno. Dzięki.
komentarz 22 września 2016 przez Sidzej Użytkownik (850 p.)
no i trochę właśnie przekombinowałem, bo nie ogarnąłem, że jest funkcja tolower i zrobiłem to na piechotę.
komentarz 22 września 2016 przez DragonCoder Nałogowiec (36,500 p.)
Moge wiedziec jaka to ksiazka?
komentarz 22 września 2016 przez Sidzej Użytkownik (850 p.)
Stephen Prata "Język c++, szkoła programowania" wydanie VI
komentarz 22 września 2016 przez DragonCoder Nałogowiec (36,500 p.)
Tez czekam na ta ksiazke :D, ale jakos nie lubie zadan z ksiazek i wole postawic na kreatywnosc... Teraz pisze sobie male czesci do kalkulatora z matematyki, gdzie da sie obliczyc pola figury, twierdzenie sinusow i cosinusow... wszystko co sie tylko uda mi dodac + fizyka... A w miedzy czasie jeszcze powstaje mala gra... Dzisiaj mialem ksiazke o C++ od samego tworcy jezyka, ale nie stety po niemiecku... CHociaz tam to juz wyzszy poziom. Wszystko zaczyna sie od wlasnych funkcji
komentarz 22 września 2016 przez Sidzej Użytkownik (850 p.)
No to jeszcze nie mój poziom ;] A książka sama w sobie całkiem fajna, dobrze się czyta.
komentarz 23 września 2016 przez DragonCoder Nałogowiec (36,500 p.)
Czy nie twoj poziom to nie tak do konca, bo to iczy jednak juz od poczatku uzywania wlasnych funkcji a to raczej dobre ptzyzwyczajenie
komentarz 25 stycznia 2017 przez bartolinciu Dyskutant (7,580 p.)
Stringa można zapisać jako tablicę. Metoda std::string.c_str() zwraca adres bezpośrednio na tablicę charów "zawartą" w zmiennej string.
komentarz 25 stycznia 2017 przez bartolinciu Dyskutant (7,580 p.)
Bez własnych funkcji w programowaniu daleko nie zajedziesz :)

1 odpowiedź

+1 głos
odpowiedź 25 stycznia 2017 przez bartolinciu Dyskutant (7,580 p.)
Zamiast całej tej pętli użyj funkcji getline i po kłopocie:)

Podobne pytania

0 głosów
2 odpowiedzi 454 wizyt
0 głosów
1 odpowiedź 1,947 wizyt
pytanie zadane 3 grudnia 2015 w C i C++ przez Kaydan Początkujący (260 p.)
0 głosów
1 odpowiedź 530 wizyt
pytanie zadane 12 czerwca 2018 w C i C++ przez Agnes Użytkownik (990 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...