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

Zamiana liter w stringu

Ostatnio zmodyfikowano 2023-01-06 18:34
Autor Wiadomość
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
C/C++
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?
P-178956
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ę.
C/C++
//strcat( dst, "  " );
dst[ j + 1 ] = ' ';
dst[ j + 2 ] = ' ';
P-178957
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
P-178958
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.
P-178959
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.
P-179842
« 1 »
  Strona 1 z 1