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

[WinSock] Łączenie dwóch ciągów znaków

Ostatnio zmodyfikowano 2015-12-02 18:22
Autor Wiadomość
Rock24
Temat założony przez niniejszego użytkownika
[WinSock] Łączenie dwóch ciągów znaków
» 2015-12-02 01:50:21
Witam.
Oto część kodu, która sprawia problem.
C/C++
memset( & bufor, 0, sizeof( bufor ) );
bajty = recv( i, bufor, sizeof( bufor ), 0 );
if( bajty == 0 )
{
    for( vector < info_o_kliencie >::iterator it = vektor.begin(); it != vektor.end(); it++ ) //info o kliencie to struktura
    {
        if( i == it->nr_gniazda )
        {
            cout << "Rozlaczyl sie " << it->host << "\n";
            char * nik = it->host;
            char napis[] = "Rozlaczyl sie ";
            strcat( napis, nik );
            cout << napis;
            vektor.erase( it ); // w wektorze sa obiekty struktury
            return 0;
        }
    }
Gdy odpalam program wszystko teoretycznie przebiega dobrze, wyświetla się złączony napis, ale program praktycznie natychmiast przestaje działać. Pokazuje się komunikat systemowy "Program serwer.exe przestał działać", w szczegółach pisze że jest to APPCRASH. Podejrzewam, że jest to wina linijki strcat(napis,nik);, gdy ją się usunie wszystko jest dobrze.
P-141270
j23
» 2015-12-02 14:22:27
Czemu rzeźbisz w c-stringach, zamiast użyć klasy std::string?

Błąd polega na tym, że napis ma rozmiar taki, jak literał "Rozlaczyl sie ", a Ty do tej tablicy chcesz jeszcze dopisać nik. Tablica jest po prostu za mała.

Najsensowniej zredukować to do takiej postaci:
cout << "Rozlaczyl sie " << it->host << '\n';


P-141280
Rock24
Temat założony przez niniejszego użytkownika
» 2015-12-02 15:29:54
Dzięki za odpowiedź.
Chciałem to połączyć bo później całość musze wysłać do wszystkich klientów z informacją kto się rozłączył.
A robie to w c strngach bo chciałem zrozumieć jak działają. Czyli nie da sie tego zróbić bez ustalania z góry wielkości tablicy 'napis'(char napis[124]?
P-141296
j23
» 2015-12-02 18:22:39
Da się. Musisz obliczyć długość obu łańcuchów i stworzyć na stercie tablicę o odpowiedniej wielkości. Z drugiej strony jeśli it->host jest ograniczony do jakiejś rozsądnej liczby liter, wtedy możesz spokojnie ustalić z góry bezpieczną wielkość tablicy.


P-141314
« 1 »
  Strona 1 z 1