[WinSock] Łączenie dwóch ciągów znaków
Ostatnio zmodyfikowano 2015-12-02 18:22
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. 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++ ) { 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 ); 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. |
|
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'; |
|
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]? |
|
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.
|
|
« 1 » |