Odwrócenie tekstu w tablicy znaków

Odwrócenie tekstu w tablicy znaków
P6
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0

Mam odwrócić zdanie używając drugiej tablicy. Taki mam kod:

Kopiuj
#include <stdlib.h>
#include <stdio.h>
#include <string.h>



int main()
{
   char text[] = "Ala ma kota";
  
   int len = strlen(text);
   char text2[len];
   
   int j = 0;
    puts(text);
   putchar('\n');
   for(int i = len-1; i>= 0; i--)
   {
       text2[j] = text[i];
       j++;
      
   }
   puts(text2);
   

    return 0;
}


a to co pokazuje:

Ala ma kota

Kopiuj
atok am alA�U

Skąd te dziwne znaczki na końcu, gdzie jest błąd? dzięki za odpowiedzi

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

char text2[len+1]={0}; - poczytaj o znaku końca napisu.

Kopiuj
#include <stdio.h>
#include <string.h>

int main()
{
   char text[] = "Ala ma kota";
   int len=strlen(text);
   char text2[len+1]={0};
   printf("%s\n",text);   
   for(int p=0,k=len-1;k>=0;++p,--k) text2[p]=text[k];
   printf("%s\n",text2);
   return 0;
}
Riddle
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10227
0
Pysa6 napisał(a):

Mam odwrócić zdanie używając drugiej tablicy. Taki mam kod:

Kopiuj
#include <stdlib.h>
#include <stdio.h>
#include <string.h>



int main()
{
   char text[] = "Ala ma kota";
  
   int len = strlen(text);
   char text2[len];
   
   int j = 0;
    puts(text);
   putchar('\n');
   for(int i = len-1; i>= 0; i--)
   {
       text2[j] = text[i];
       j++;
      
   }
   puts(text2);
   

    return 0;
}


a to co pokazuje:

Ala ma kota
atok am alA�U

Skąd te dziwne znaczki na końcu, gdzie jest błąd? dzięki za odpowiedzi

Problem nie jest w odwracaniu, tylko w wyświetlaniu.

Przeczytaj dokumentację puts():

https://cpp0x.pl/dokumentacja/standard-C/puts/333

Funkcja zapisuje przekazany łańcuch znaków do standardowego strumienia wyjścia (» standard C ♦ stdout), a następnie zapisuje znak przejścia do nowej linii ('\n'). Łańcuch znaków musi być zakończony znakiem terminalnym '\0'. Znak terminalny nie jest zapisywany do strumienia.

P6
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 21
0

@_13th_Dragon: @Riddle nie jest błędem może to, ze na rozmiar tablicy ustawiam len, które jest obliczane, a nie stała liczba?

BG
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 293
1
Pysa6 napisał(a):

@_13th_Dragon: @Riddle nie jest błędem może to, ze na rozmiar tablicy ustawiam len, które jest obliczane, a nie stała liczba?

Nie, w języku C taka deklaracja jest legalna.
Błędy masz dwa i @_13th_Dragon już Ci na nie zwrócił uwagę

  1. Ta druga tablica jest za mała, bo nie zmieścisz w niej "końcowego" zera (powinna mieć rozmiar co najmniej len+1)
  2. Nie wstawiasz tego zera do tej drugiej tablicy, co powoduje że puts() wyświetla śmieci
KS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 708
0

Jak tylko wypisać to fajniej byłoby użyć putchar. Będzie mniej pisaniny.

Mniej bazgraniny

Kopiuj
char word[] = "wuj gupi";
for( int i = strlen( word ) - 1; i >= 0; i-- )  putchar( word[i] );
ZK
  • Rejestracja: dni
  • Ostatnio: dni
0

ja podam swój kod xD

Kopiuj
using namespace std;

int main()
{
    string tekst="tekst do odwrocenia";

    int ileZnakow=0;

    for(unsigned int i=0; i<tekst.size(); ++i){
        ileZnakow++;
    }

    string *tmp = new string[ileZnakow];

    for(int i=ileZnakow-1, j=0; i>=0; --i, ++j){
        char znak=tekst[i];
        tmp[j]=znak;
    }

    for(int i=0; i<ileZnakow; ++i){
        cout << tmp[i];
    }

    cout << endl;

    delete [] tmp;
}

wersja w C

Kopiuj
int main()
{
    const char *tekst="tekst do odwrocenia";

    int ileZnakow=0;

    for(const char *a=tekst; *a; ++a){
        ++ileZnakow;
    }

    char *tmp = malloc(ileZnakow);

    for(int i=ileZnakow-1; i>=0; --i){
        char znak=tekst[i];
        *tmp=znak;
        printf("%c", *tmp);
    }

    free(tmp);

    return 0;
}

a teraz czekam na opinie specjalistów - czas start xD

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
2
zkubinski napisał(a):
Kopiuj
    int ileZnakow=0;
    for(unsigned int i=0; i<tekst.size(); ++i){
        ileZnakow++;
    }

Dopóki nie zrozumiesz że powyższy kod jest tym samym co:

Kopiuj
int ileZnakow=tekst.size();

To wróć do totalnych podstaw z podstaw.
W c++ to powinno wyglądać jakoś tak:

Kopiuj
#include <iostream>
#include <string>
using namespace std;

int main()
{
    string tekst="tekst do odwrocenia";
    string rev(rbegin(tekst),rend(tekst));
    cout<<rev<<endl;
    return 0;
}

W obu przypadkach NIE MASZ odwróconego napisu jak napisano w zadaniu.
Co do kodu w C, czy rozumiesz że to:

zkubinski napisał(a):
Kopiuj
```    for(int i=ileZnakow-1; i>=0; --i){
```        char znak=tekst[i]; 
```        *tmp=znak;
```        printf("%c", *tmp);
```    }

jest dokładnie tym samym co to:

Kopiuj
    for(int i=ileZnakow-1;i>=0;--i) printf("%c",tekst[i]);

?
Jedynie wywaliłem zbędne "ruchy ciała"
Czyli cały kod po optymalizacji i eliminacji zbędnych części musi wyglądać jakoś tak:

Kopiuj
#include <stdio.h>
#include <string.h>

int main()
{
    const char *tekst="tekst do odwrocenia";
    for(int i=strlen(tekst)-1;i>=0;--i) printf("%c",tekst[i]);
    return 0;
}

Ty olewasz wszystkie sensowne rady od wszystkich na tym forum, już ci podałem co musisz zrozumieć zanim zaczniesz coś kombinować z c-string'ami

ZK
  • Rejestracja: dni
  • Ostatnio: dni
0

@_13th_Dragon:

poprawiłem kod - wczoraj zrobiłem babola ze stringiem - ale wbrew temu co mówisz tablica była odwrócona - zaznaczyłem w komentarzu gdzie jest ona odwrócona

Kopiuj
int main()
{
    string tekst="tekst do odwrocenia";

    int size=tekst.size()+1;
    char *tmp = new char[size];

    for(int i=size-2, j=0; i>=0; --i, ++j){
        char znak=tekst[i];
        tmp[j]=znak;

        if(j==(size-2)){
            tmp[size-1]='\0';
        }
    }

    for(int i=0; i<size; ++i){
        cout << tmp[i]; //tutaj wypisuję odwrócony string
    }

    cout << endl;

    delete [] tmp;
}
_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1

Człowieku, dostałeś przykładowy kod, dopóki nie doprowadzisz do chociażby bliskiego rozmiaru i złożoności to nie ma co zaśmiecać forum tym syfem.

  1. Zdecyduj się czy to C czy C++ bo jak C++ to operuj na stringach, zaś jak C to nie używaj string
  2. Jak już cię tłumaczyłem ale olałeś bądź nie przeczytałeś char znak=tekst[i]; tmp[j]=znak; można skrócić z korzyścią dla czytelności do ...
  3. Po ch...ińskiego if(j==(size-2)) { tmp[size-1]='\0'; } w pętli, nie przyszło ci do głowy zrobić tmp[size-1]='\0'; tylko raz przed lub po pętli i bez żadnego warunku?
  4. for(int i=0; i<size; ++i) { cout << tmp[i]; } cout << endl; doprawdy? A czy cout<<tmp<<endl; nie zrobi to samo w 1 wierszu zamiast 4-ch?
  5. Za wcześnie dla ciebie na napisach operować, już mówiłem co masz zbadać "różnicę pomiędzy ..." ale że dokleiłeś się do jakiegoś innego wątku tak jak teraz to nie sposób tego znaleźć

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.