Odwrócenie tekstu w tablicy znaków

0

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

#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

0

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

#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;
}
0
Pysa6 napisał(a):

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

#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.

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?

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
0

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

Mniej bazgraniny

char word[] = "wuj gupi";
for( int i = strlen( word ) - 1; i >= 0; i-- )  putchar( word[i] );
0

ja podam swój kod xD

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

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

2
zkubinski napisał(a):
    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:

int ileZnakow=tekst.size();

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

#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):
```    for(int i=ileZnakow-1; i>=0; --i){
```        char znak=tekst[i]; 
```        *tmp=znak;
```        printf("%c", *tmp);
```    }

jest dokładnie tym samym co to:

    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:

#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

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

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;
}
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źć

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