Łączenie łańcuchów znaków [char]
Ostatnio zmodyfikowano 2009-05-29 22:42
malan Temat założony przez niniejszego użytkownika |
Łączenie łańcuchów znaków [char] » 2009-05-29 20:06:01 Witam. Mam sobie taką funkcję: void StworzNowyProfil( void ) { char NazwaProfilu[ 25 ]; char Sciezka[] = "profiles//"; clrscr(); cout << PL( "Podaj nazwę profilu: " ); cin >> NazwaProfilu; strcat( NazwaProfilu, ".dat" ); strcat( Sciezka, NazwaProfilu ); fstream PlikProfilu( Sciezka ); PlikProfilu.open( Sciezka, ios::out ); if( PlikProfilu.good() ) cout << PL( "Utworzono profil!" ); else cout << PL( "Nie mogę utworzyć profilu!" ); getch(); return; } Problem polega na tym, że program tworzy plik owszem, ale gdy sprawdzam czy udało się otworzyć wyskakuje błąd. Ustaliłem, że w progr. zmienia się 'profiles//' na 'profiles/' i nie wiem dlaczego... ;/ //Edit: Jeden błąd mam - nie dodałem rozszerzenia pliku, który ma być utworzony..., ale i tak nie działa... ;/ //Edit2: Jednak z 'profiles//' jest wszystko ok... |
|
driver1995 |
» 2009-05-29 20:22:16 profiles// zmienia się na profiles/ ponieważ przy podawaniu ścieżki pisze się jednego slasha czyli profiles/ ... A chyba 2 backslashe \\ ...
//edit: No tak wszystko ok to cofam ;P |
|
malan Temat założony przez niniejszego użytkownika |
» 2009-05-29 20:31:09 Miałem na myśli, że 'profiles//' się nie zmienia na 'profiles/'. Program dalej nie działa (żeby ktoś mnie źle nie zrozumiał xD). |
|
malan Temat założony przez niniejszego użytkownika |
» 2009-05-29 20:52:51 Wszystko działa, ładnie pięknie, ale wolałbym zrozumieć jeszcze czemu mój kod nie działa... ;/ i czemu jest eksploitowalny? Ja tu dziur nie widzę ;p... |
|
malan Temat założony przez niniejszego użytkownika |
» 2009-05-29 23:37:44 Jak ja nie lubie tych charów ;/... Szkoda, że w 'fstream' nie można użyć string jak w 'ofstream'... Wtedy by nie było problemu... ;/, a tak wychodzą takie "kwiatki" ;/. Masz rację tak nie może być - muszę nad tym popracować... ;p. No nic, dzięki za pomoc... ;) |
|
manfred |
» 2009-05-29 20:38:10 Jaaa... cudownie łatwo eksploitowalny kod - pięknie podkładasz tablicę char na stos i aż się prosisz o buffer overflow... string filename; cin >> filename; ofstream plik(( "profiles/" + filename + ".dat" ).c_str() ); if( plik.fail() ) throw std::runtime_error( "zuo przyszlo i zapisac nie dalo: " + filename );
cout << "Spx, zią!"; Potem tylko pamiętaj o łapaniu wyjątku. |
|
manfred |
» 2009-05-29 22:42:20 Robisz na stosie 2 tablice o łącznym rozmiarze 36 bajtów, po czym zaczynasz niezłe kwiatki sadzić: odczytujesz do tablicy 25-bajt ciąg od usera, a jak sobie poda dłuższy niż 24 znaki to nadpisujemy adres ramki stosu i adres powrotu => SIGSEGV albo uruchamiamy kod kogoś innego. Potem doczepiasz do tego ".dat" - wystarczy 21 znaków do buraków. A kod nie działa, bo dwa razy otwierasz plik. |
|
« 1 » |