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

Szukanie słowa za pomocą strcmp

Ostatnio zmodyfikowano 2010-12-29 15:36
Autor Wiadomość
Owex
Temat założony przez niniejszego użytkownika
Szukanie słowa za pomocą strcmp
» 2010-12-29 11:25:19
Witam. Dopiero zaczynam się uczyć C++, a ponieważ teraz mam dużo wolnego czasu, więc próbowałem kombinować z pętlami, tablicami i komendą strcmp. I właśnie z tym mam problem. Wiem że komenda strcmp może "znaleźć" odpowiednią literę na podstawie porównywania słów. Ale czy może znaleźć całe zdanie? (lekcja http://kursy.ddt.pl/?LessonId=10, podpunkt 8.3.3) Mam kod:

C/C++
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
   
    //deklaracja słowa
    const int MAX = 50;
    char SLOWO[ MAX ] = "???? ??? ???";
   
    //pętla
    for( char znak = 'a'; strcmp( SLOWO, "ucze sie c++" ); znak++ )
    {
        cout << SLOWO << endl;
        SLOWO[ 0 ] = znak;
        SLOWO[ 1 ] = znak;
        SLOWO[ 2 ] = znak;
        SLOWO[ 3 ] = znak;
        SLOWO[ 4 ] = znak;
        SLOWO[ 5 ] = znak;
        SLOWO[ 6 ] = znak;
        SLOWO[ 7 ] = znak;
        SLOWO[ 8 ] = znak;
        SLOWO[ 9 ] = znak;
       
    }
   
    cout << "\n\n\n\n Szukane zdanie to " << SLOWO << ".\n\n\n\n";
    cout << "         ***Nacisnij ENTER by zakonczyc...***";
   
    getchar();
    return 0;
}

Kiedy uruchamiam komputer zaczyna "piszczeć" :D Co jest źle?
P-25845
malan
» 2010-12-29 11:45:22
No to pojechałeś :D.
C/C++
#include <iostream>

const int SENTENCES_COUNT = 4;

int main()
{
    char * sentencesArray[] = {
        "Ucze sie C++ od dwoch lat.",
        "Mam na imie Jozef",
        "Mam 13 lat",
        "Dzis mam zly humor"
    };
    char sentence[ 30 ] = { '\0' };
   
    std::cout << "Jakie zdanie chcesz wyszukac? " << std::endl;
    std::cin.getline( sentence, 30 );
   
    for( int i = 0; i < SENTENCES_COUNT; i++ )
    {
        if( strncmp( sentence, sentencesArray[ i ], strlen( sentence ) ) == 0 )
        {
            std::cout << "Znalazlem zdanie: " << sentencesArray[ i ] << ", (" << i << ")";
            break;
        }
    }
   
    std::cin.sync();
    std::cin.get();
    return 0;
}
Jeżeli chciałbyś wyszukać jakiś podciąg w zdaniu, to zainteresuj się std::string::find.
P-25848
Owex
Temat założony przez niniejszego użytkownika
» 2010-12-29 11:51:32
Jakiś skomplikowany ten kod... połowy komend nawet nie znam, a mi chodziło o to czy da się za pomocą strcmp znaleźć całe zdanie, oraz jak to zrobić bo mi wychodzi błąd. A swoją drogą to mam jeszcze jeden problem, ale tym razem z mnożeniem i dzieleniem w pętli for. Daję kod:

C/C++
#include <conio.h>
#include <iostream>
using namespace std;
int main()
{
    int a = 1;
   
    for( a; a < 27; a * 3 )
    {
        cout << a << ',';
    }
   
    getchar();
    return 0;
}
 1,3,9,27, wychodzi mi 1,1,1,1,1(...). Dlaczego?
P-25850
ison
» 2010-12-29 11:55:49
bo a się nie zmienia
prędzej
a *= 3
 a nie
a * 3
P-25851
malan
» 2010-12-29 11:57:57
a mi chodziło o to czy da się za pomocą strcmp znaleźć całe zdanie
Jeżeli chodzi Ci o coś takiego:
C/C++
char sentence[] = "To jest jakis piekny monolog, zbudowany z kliku zdan. Pisze go tylko dla przykladu. Jestem bardzo glodny... i chce mi sie slodkiego. Ale ladna pogoda.";
char sentenceSerch[] = "Pisze go tylko dla przykladu"; // Zdanie, którego szukamy.

if( strcmp( sentence, sentenceSerch ) == 0 )...
To nie. strcmp porównuje, a nie szuka :).
P-25852
Owex
Temat założony przez niniejszego użytkownika
» 2010-12-29 14:42:12
Ale mi chodzi właśnie o porównywanie, ale więcej niż jednego znaku. Tak jak w przykładzie:
C/C++
//Pętla porównanie łańcucha----------------
#include <iostream>
#include <conio.h>
#include <cstring>
//-----------------------------------------
int main()
{
    using namespace std;
    const short MAX_ZNAKOW = 16; //stała dla indeksu tabeli
    char slowo[ MAX_ZNAKOW ] = "Program?j w C++";
   
    //strcmp porównuje "slowo" z podanym wzorcem, jeśli porównanie da pozytywny wynik wtedy pętla zakończy działanie 
    for( char znak = 'a'; strcmp( slowo, "Programuj w C++" ); znak++ )
    {
        cout << slowo << endl;
        slowo[ 7 ] = znak;
    }
    cout << "\nSzukana litera to, \"" << slowo[ 7 ]
    << "\""
    << "\nPetla zakonczyla dzialanie prawidlowy wyraz"
    << " to: " << slowo << endl;
   
    getch();
    return 0;
} //----------------------------------------

Tylko w przykładzie porównywany jest jeden znak i wszystko działa poprawnie. W moim przykładzie (w 1st poście) porównuję więcej znaków, a wtedy program przestaje działać poprawnie. Dlaczego? I czy komendą strcmp da się porównywać więcej niż jeden znak?


I nowy problem: Piszę tutaj żeby nie zakładać nowego tematu. Na tej stronie http://kursy.ddt.pl/?LessonId=10 ostatnie ćwiczenie polega na tym, żeby zrobić program księgowy (szczegóły przeczytajcie sami- jest to na samym dole strony). Ja mam kod:
C/C++
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
    //deklaracja zmiennych i tablicy
    //--------------------------------------------------------------------------
    const int KWARTALY = 5;
    const int LATA = 4;
   
   
   
    const char tab1[ KWARTALY ][ LATA ] =
    {
        { ' ', 1999, ' ', 2000 },
        { 1, 2075000, ' ', 532500 },
        { 2, 2205000, ' ', 479250 },
        { 3, 2150000, ' ', 1479250 },
        { 4, 1065000, ' ', 1229250 },
    };
   
   
    //--------------------------------------------------------------------------
    cout << "                             Firma DDT\n"
    << "                        *Program ksiegowy*\n";
   
    for( int X = 0; X < KWARTALY; X++ )
    {
        cout << tab1[ X ] << endl;
    }
   
   
   
    cin.get();
    getchar();
    return 0;
}

Zamiast tabeli wychodzą mi bezsensowne znaki (sami zobaczcie). Co zrobić? Nie chcę innych komend niż pętli for i tablic dwuwymiarowych(tego co użyte w przykładzie powyżej). Co zrobić żeby wyszła ta tabela?
P-25857
DejaVu
» 2010-12-29 15:36:32
Dokumentacja
PrzeszukiwanieFunkcje przeszukujące łańcuchy znaków. (kategoria)
Porównywanie tekstuPorównywanie dwóch łańcuchów znaków. (kategoria)
strcmpPorównuje dwa łańcuchy znaków. (funkcja)

Reasumując: złej funkcji używasz do szukania podciągu znaków w tekście.

/edit:
Jeden temat = jeden problem.
P-25860
« 1 »
  Strona 1 z 1