Zamiana liter w stringu

0

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;

  for(int i=0;i<strlen(src);i++)
    if(src[i]!=' ')
      char_counter++;

  memset(dst,'\0',(char_counter)*3+1);
  if(src=="")
    dst="";
  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?

2
  1. A jak używasz tej funkcji? Jesteś pewien ze alokujesz wystarczająco dużo pamięci na wynik?
  if(src=="")
    dst="";

To jest na pewno źle. Po pierwsze nie możesz tak porównać char* a po drugie nadpisujesz w ten sposób wskaźnik dst na jakiegoś statycznego stringa "" a potem robisz dst[j-2]='\0'; co na pewno nie jest legalne i nadpisze jakąś losową pamięć.

0

A gdyby zrobić to tak

if(strcmp(str,"")==0)
strcpy(dst,"");
2
  memset(dst,'\0',(char_counter)*3+1);

moim zdaniem powinno raczej być char_counter*2+1

0

serwer zwraca mi mi błąd free() invalid pointer

Próbujesz uwolnić coś, co nie jest wskaźnikiem
Istnieją dwa główne typy pamięci: "pamięć stosu" i "pamięć sterty"
Pamięć sterty żyje od momentu użycia zarezerwowania pamięci malloc aż do jej uwolnienia free
Możesz używać tylko free do pamięci, która została przydzielona za pomocą malloc

0

Przepchnij swój kod przez coś takiego:
https://godbolt.org/z/xs9z9vKc7

1
void vaporcode(const char *src, char *dst) {
  int j=0;
  int char_counter=0; // po co ci to? Przecież znaki niebiałe można wykrywać w locie

  for(int i=0;i<strlen(src);i++)
    if(src[i]!=' ')
      char_counter++;

  memset(dst,'\0',(char_counter)*3+1);
  if(src=="") // to porównanie jest bezsensu! w `C` to porównuje wskaźniki, a nie napisy!
    dst=""; // ustawiwsz wskaźnik dst na coś co nie musi być modyfikowalne - to zachowanie niezdefiniowane - powinno prowadzić do crash!!!!!
  for(int i=0;i<strlen(src);i++){
      if(src[i]!=' '){
          dst[j] = toupper(src[i]);
          strcat(dst,"  ");
          j+=3;
      }
  }
  dst[j-2]='\0'; // strcat już zostawia zero na końcu
}

Dobra może lepiej pokazać swoją implementację:

const char* skipSpaces(const char *src) {
    while (*src && isspace(*src)) ++src;
    return src;
}

void vaporcode(const char *src, char *dst) {
    src = skipSpaces(src);
    if (*src) {
        *dst++ = toupper(*src++);
        src = skipSpaces(src);
        while (*src) {
            *dst++ = ' ';
            *dst++ = ' ';
            *dst++ = toupper(*src++);
            src = skipSpaces(src);
        }
    }
    *dst = 0;
}

https://godbolt.org/z/aojTEhqE3

1

Po kiego przekombinowywać?

void vaporcode(const char *src, char *dst)
{
        for(bool needspaces=false;*src;needspaces=true,++src)
        {
                if(!isspace(*src))
                {
                        if(needspaces)
                        {
                                *dst++ = ' ';
                                *dst++ = ' ';
                        }
                        *dst++=toupper(*src++);
                }
        }
        *dst = 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1