Zamiana liter w stringu
Ostatnio zmodyfikowano 2023-01-06 18:34
gonskabalbinka Temat założony przez niniejszego użytkownika |
Zamiana liter w stringu » 2021-09-12 11:40:56 Witam piszę funkcję której zadaniem jest zmiana tablicy znaków na wyjściową, polegająca na zmianie małej litery na dużą i dodanie dwóch spacji. Przykład poniżej "Lets go to the movies" --> "L E T S G O T O T H E M O V I E S" "Why isn't my code working?" --> "W H Y I S N ' T M Y C O D E W O R K I N G ?" kod zamieszczam poniżej void vaporcode( const char * src, char * dst ) { int j = 0; int char_counter = 0; printf( "%s\n", src ); if( src[ 0 ] == '\0' ) { dst[ 0 ] = '\0'; return; } for( int i = 0; i < strlen( src ); i++ ) if( src[ i ] != ' ' ) char_counter++; memset( dst, '\0', char_counter * 3 + 1 ); for( int i = 0; i < strlen( src ); i++ ) { if( src[ i ] != ' ' ) { dst[ j ] = toupper( src[ i ] ); strcat( dst, " " ); j += 3; } } dst[ j - 2 ] = '\0'; }
Funkcja chyba nieprawidłowo obsługuje pustą tablicę bo czasami serwer zwracami mi błąd free() invalid pointer a czasami działa prawidłowo. Czy ktoś może mi powiedzieć gdzie jest błąd? |
|
DejaVu |
» 2021-09-12 11:45:20 Skoro błąd masz przy zwalnianiu pamięci, to zapewne leży on poza tym kodem (np. alokujesz 0 bajtów). Ten strcat jest raczej zbędny - lepiej po prostu dopisać spacje ręcznie skoro znasz ich lokalizację. dst[ j + 1 ] = ' '; dst[ j + 2 ] = ' ';
|
|
gonskabalbinka Temat założony przez niniejszego użytkownika |
» 2021-09-12 12:00:10 To jest zadanie z codewars
Write a function that converts any sentence into a V A P O R W A V E sentence. a V A P O R W A V E sentence converts all the letters into uppercase, and adds 2 spaces between each letter (or special character) to create this V A P O R W A V E effect.
EXAMPLES "Lets go to the movies" --> "L E T S G O T O T H E M O V I E S" "Why isn't my code working?" --> "W H Y I S N ' T M Y C O D E W O R K I N G ?"
a to jest lista ostrzeżeń, które dostaję po odpaleniu funkcji
solution.c:4:3: warning: implicitly declaring library function 'printf' with type 'int (const char *, ...)' [-Wimplicit-function-declaration] printf("%s\n",src); ^ solution.c:4:3: note: include the header <stdio.h> or explicitly provide a declaration for 'printf' solution.c:10:17: warning: implicitly declaring library function 'strlen' with type 'unsigned long (const char *)' [-Wimplicit-function-declaration] for(int i=0;i<strlen(src);i++) ^ solution.c:10:17: note: include the header <string.h> or explicitly provide a declaration for 'strlen' solution.c:13:3: warning: implicitly declaring library function 'memset' with type 'void *(void *, int, unsigned long)' [-Wimplicit-function-declaration] memset(dst,'\0',char_counter*3+1); ^ solution.c:13:3: note: include the header <string.h> or explicitly provide a declaration for 'memset' solution.c:17:20: warning: implicitly declaring library function 'toupper' with type 'int (int)' [-Wimplicit-function-declaration] dst[j] = toupper(src); ^ solution.c:17:20: note: include the header <ctype.h> or explicitly provide a declaration for 'toupper' solution.c:10:16: warning: comparison of integers of different signs: 'int' and 'unsigned long' [-Wsign-compare] for(int i=0;i<strlen(src);i++) ~^~~~~~~~~~~~ solution.c:15:16: warning: comparison of integers of different signs: 'int' and 'unsigned long' [-Wsign-compare] for(int i=0;i<strlen(src);i++){ ~^~~~~~~~~~~~ 6 warnings generated. free(): invalid pointer
Według mnie coś jest nie tak z obsługą pustego stringa |
|
DejaVu |
» 2021-09-12 12:02:33 Jeżeli masz tylko napisać funkcję to skup się na obsłudze skrajnych przypadków. Przykład: jak Twój kod się zachowa, gdy nullptr będzie przekazany poprzez argument funkcji (odpowiedź aktualna brzmi: błędnie).
/edit: Warningi natomiast sugerują, że powinieneś dodać headery do swojego rozwiązania. |
|
tBane |
» 2023-01-06 18:34:06 Pobaw sie z ASCII. ASCII to tablica znakow (char). tak wiec np. takie "0" (zero) ma wartosc zazwyczaj 48, co sprawdzisz piszac: cout << int(0);
Zrob to samo dla liter: if( int(literka) < int("z")) literka = char( int(literka) - ( roznica w liczbie miedzy 'A' i 'a' );
to chyba powinno dzialac.
|
|
« 1 » |