Problem z dynamicznym przydzielaniem pamieci
Ostatnio zmodyfikowano 2011-11-10 23:50
Savail Temat założony przez niniejszego użytkownika |
Problem z dynamicznym przydzielaniem pamieci » 2011-11-10 23:31:55 Hej, Natknalem sie na problem ktorego nie moge zrozumiec i rozwiazac... Otoz ponizsza funkcja find ma za zadanie zwrocic C string z danego parametru line tak dlugi dopoki nie dojdzie do znaku end. Problemem jest to ze zwracany C string oprocz wlasciwych liter zawiera tez jakies losowe znaki i nie mam pojecia jak sie ich pozbyc... Powinien zwrocic "file:" a zwraca "file:" + 2 znaki nie wiadomo skad ;/ Bylbym ogromnie wdzieczny za pomoc. char * find( const char * line, int line_length, char end );
int main() { std::cout << find( "file: somefile", 19, ' ' ); }
char * find( const char * line, int line_length, char end ) { char * old_data = new char[ line_length ]; char * new_data = NULL; int counter = 0; while( line[ counter ] != end && counter < line_length ) { old_data[ counter ] = line[ counter ]; counter++; } new_data = new char[ counter ]; memcpy( new_data, old_data, counter ); if( counter < line_length ) return new_data; else return "false"; }
|
|
DejaVu |
» 2011-11-10 23:34:56 Każdy łańcuch znaków w stylu C jest zakończony znakiem terminalnym (czyli znakiem o kodzie ASCII 0). Po tym znaku są śmieci. |
|
Savail Temat założony przez niniejszego użytkownika |
» 2011-11-10 23:38:28 no ale przeciez dla C stringa ktory ma byc zwrocony w funkcji przydzielam rozmiar rowny ilosci elementow ktore ma pomiescic. Wiec jakim cudem wyswietla jeszcze smieci? Juz od dobrej godziny nie moge tego rozkminic... |
|
DejaVu |
» 2011-11-10 23:41:02 Jeżeli łańcuch znaków ma 5 znaków to w rzeczywistości zajmuje on 6 znaków. |
|
Drraven |
» 2011-11-10 23:47:00 Bufor musi być równy długości tekstu + 1 znak na '\0' własnie; czyli: char buffor[ legth( tekst ) + 1 ]; |
|
Savail Temat założony przez niniejszego użytkownika |
» 2011-11-10 23:48:42 Dzieki wielkie za odpowiedzi. Czy to znaczy ze zwroconemu C stringowi powinienem zmniejszyc rozmiar aby sie normalnie wyswietlal? int main() { std::string found = find( "file: somefile", 19, ' ' ); found.resize( found.length() - 2 ); std::cout << found; } Teraz np w koncu wyswietla sie normalnie ale musialem mu zmniejszyc rozmiar az o 2. To wlasnie tez dziwne ze w moim programie pokazywaly sie 2 znaki dodatkowe(smieci) a skoro tak jakby 1 znak jest dodawany to niby powinien sie 1 smiec dodatkowo wyswietlac... |
|
DejaVu |
» 2011-11-10 23:50:03 Dojdź do rozwiązania sam. Masz wskazówki w czym leży problem - druga opcja to poczytać dokumentację. |
|
« 1 » |