Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

strcmp() i petla x?

Ostatnio zmodyfikowano 2014-04-29 10:37
Autor Wiadomość
bybue1
Temat założony przez niniejszego użytkownika
strcmp() i petla x?
» 2014-04-28 14:24:41
Witam, robie zadania z ksiazki o c++ i zatrzymalem sie na zadaniu o tresci:
"Napisz program korzystjacy z tablicy char, odczytujacy w petli slowo po slowie az do wypisania "gotowe". Nastepnie program powienien pokazywac liczbe podanych slow (poza gotowe). Przy porownaniach uzyj funkcji strcmp() i pliku naglowkowego cstring."
a oto moj nic nie warty kod:
C/C++
#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    cout << "Podawaj slowa (kiedy skonczysz, napisz \"gotowe\")\n";
    char tekst[ 100 ];
    int ilosc = 0;
    cin.get( tekst, 100 );
    while( tekst != "gotowe" )
    {
        cin.get( tekst, 100 );
       
    }
    cout << "Podano " << ilosc << " slow.";
   
    system( "pause" );
    return 0;
}
1 Nie wiem jaka petle uzyc
2 Nie wiem jak zliczyc ilosc wyrazow (znaki jeszcze jakos potrafilbym).

Prosze o jakies wskazowki.
P-108847
RazzorFlame
» 2014-04-28 14:52:58
Źle to zrobiłeś, wczytujesz za każdym razem słowo do tego samego bufora czyli tracisz poprzednie dane. Zrób w ten sposób:
C/C++
std::vector < char *> wyrazy;
char * wczytany = "";
while( wczytany != "gotowe" )
{
    std::cin.get( wczytany, 100 );
    wyrazy.push_back( wczytany );
}
std::cout << "Ilosc: " << wyrazy.size() << std::endl;
P-108848
bybue1
Temat założony przez niniejszego użytkownika
» 2014-04-28 15:19:43
Dzieki za pomoc ale z tego co napisales to to nie dziala do konca.
C/C++
#include <iostream>
#include <cstring>
#include <vector>

using namespace std;

int main()
{
    cout << "Podawaj slowa (kiedy skonczysz, napisz \"gotowe\")\n";
    vector < char *> wyrazy;
    char * wczytany = "";
    while( wczytany != "gotowe" )
    {
        cin.get( wczytany, 100 );
        wyrazy.push_back( wczytany );
    }
    cout << "Ilosc: " << wyrazy.size() << endl;
    system( "pause" );
    return 0;
}
I nie wiec co robi push_back. Czy potrafilbys zrobic uzywajac strcmp, tak jak w poleceniu?
P-108851
RazzorFlame
» 2014-04-28 16:46:51
Jak "nie działa do końca"?
Strcmp porównuje dwie tablice znaków...
w pętli zamień warunek na "strcmp(wczytany, "gotowe") != 0"
Push back dodaje na koniec vectora żądany obiekt
P-108855
pekfos
» 2014-04-28 17:42:35
Zrób w ten sposób:
C/C++
std::vector < char *> wyrazy;
char * wczytany = "";
while( wczytany != "gotowe" )
{
    std::cin.get( wczytany, 100 );
    wyrazy.push_back( wczytany );
}
std::cout << "Ilosc: " << wyrazy.size() << std::endl;
Żartujesz..?
P-108863
RazzorFlame
» 2014-04-28 19:24:17
Żartujesz?
Owszem.
P-108869
bybue1
Temat założony przez niniejszego użytkownika
» 2014-04-28 20:50:45
Dla pelnej klarownosci dodam jeszcze raz kod/
C/C++
#include <iostream>
#include <cstring>
#include <vector>

using namespace std;

int main()
{
    cout << "Podawaj slowa (kiedy skonczysz, napisz \"gotowe\")\n";
    vector < char *> wyrazy;
    char * wczytany = "";
    while( strcmp( wczytany, "gotowe" ) != 0 )
    {
        cin.get( wczytany, 100 );
        wyrazy.push_back( wczytany );
    }
    cout << "Ilosc: " << wyrazy.size() << endl;
   
    system( "pause" );
    return 0;
}
podczas kompilacji pojawia sie warning:
11 20[Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]

co powoduje krasz aplikacji za kazdym wlaczeniu po wpisaniu czegokolwiek i zatwierdzeniem <enter>.
Nie dziala?
P-108872
pekfos
» 2014-04-29 10:37:54
C/C++
cin.get( wczytany, 100 );
Heh, a gdzie ty to próbujesz zapisać? I skąd te 100? wczytany wskazuje na stałą (błąd) tablicę, do której próbujesz zapisać (UB) tekst. Do tego ta tablica ma 1 element, a nie 100 (UB). Powinno to wyglądać tak:
C/C++
char wczytany[ 100 ];
Dalej: std::vector<> to znacznie więcej zachodu niż potrzeba, o ile nie użyjesz std::string. Z char*, push_back() nie skopiuje stringa - po prostu będziesz cały czas dodawać ten sam adres, pod którym będzie ostatni wczytany tekst. Musiałbyś za każdym dodaniem alokować pamięć, kopiować łańcuch, a na koniec programu wypadałoby jeszcze zwolnić całą pamięć. Do tego, zadanie mówi tylko o ilości słów, a nie o wypisywaniu słów, czy coś takiego. Wystarczy zwykły int..
P-108907
« 1 »
  Strona 1 z 1