Generowanie ostatniego alfabetycznie palindromu - nieproszone znaki na wyjściu

0

Witam,
napisałem program, który pobiera od użytkownika dowolny palindrom, następnie generuje jego ostatni alfabetycznie odpowiednik. Dla przykładu:
wejście: latootal wyjście: tolaalot
wejście: alaala wyjście: laaaal
Wszystko działa ok, przykładowe i wymyślone przeze mnie dane przechodzą bez problemu. Jednak z założenia ma być użyty kompilator G++ (taki jest na platformie uczelni), natomiast ja pisałem w IDE Dev C++, w którym jest Mingw port GCC. I na wyjściu w przypadku ciągu: latootal zamiast tolaalot otrzymuję dwa romby ze znakiem zapytania tolaDZalot. I tutaj niezbyt wiem jak się tego pozbyć, więc kieruję prośbę do Was o wskazówki, na kierunkowanie mnie co może być nie tak :)
Kod programu:

#include <cstring>
#include <algorithm>
#include <iostream>
#include <fstream>
 
using namespace std ;
 
char x[231];
int compare (const void * a, const void * b)
{
    return *(char*)a-*(char*)b;
}

void reverse(char word[])
{
    int len=strlen(word);
    for (int i=0;i<len/2;i++)
    {
        word[i]^=word[len-i-1];
        word[len-i-1]^=word[i]; 
        word[i]^=word[len-i-1];
    }
}

int main()
{
    char x2[231];
    char x3[231];
    scanf("%300s",x);
    
    if (strlen(x) % 2 == 0) 
    {
        strncpy(x2,x,strlen(x)/2);
        qsort (x2,strlen(x2),1,compare);
        reverse(x2);
                
        strncpy(x3,x,strlen(x)/2);
        qsort (x3,strlen(x3),1,compare);
        
        cout << x2 << x3;
    }
    else if (strlen(x) % 2 != 0) 
    {
	int lenght = strlen(x);
        int t1 = lenght/2;
        
        strncpy(x2,x,strlen(x)/2);
        qsort (x2,strlen(x2),1,compare);
        reverse(x2);
        
	strncpy(x3,x,strlen(x)/2);
        qsort (x3,strlen(x3),1,compare);

        cout << x2<<x[(strlen(x)/2)]<<x3;
    }
}
0

źle: scanf("%300s",x); a masz x[231].
po co mieszasz C (scanf qsort) i STL z C++ (cout)? Zdecyduj się na jedno
strncpy nie dodaje kończącego zera na końcu jeśli nie kopiujesz całego c-stringa, więc to szczęście decyduje czy masz tam potrzebne zera czy nie - i stare gcc jest dla ciebie "szczęśliwe" - to tu jest twój błąd.

Radzę przepisać wszystko stosując STL (ja się zmieściłem w 15 liniach licząc puste linie przeznaczone na estetykę) (nie jest konieczne rozróżnianie przypadków o parzystej i nieparzystej długości).

1

K**wa, ale ludzi nie potrafią myśleć. Przecież to zadanie to tylko zakamuflowane: -posortuj podany napis nie rosnąco:

#include <iostream>
#include <algorithm>
using namespace std;

int main()
  {
   string s;
   cin>>s;
   sort(s.rbegin(),s.rend());
   cout<<s<<endl;
   return 0;
  }
</del>

w związku ze słuszną uwagą od @Endrju, muszą dojść dwa wiersze:

#include <iostream>
#include <algorithm>
using namespace std;

int main()
  {
   string s;
   cin>>s;
   size_t half=s.length()>>1; // length/2
   sort(s.begin(),s.begin()+half,greater<char>());
   sort(s.end()-half,s.end());
   cout<<s<<endl;
   return 0;
  }
0

Dziękuję serdecznie za pomoc. Myślałem, że i tak napisałem dość krótko, a tu widzę, że można nie tylko krócej ale i wielokroć poprawniej :) Jeszcze raz dzięki :)

0

Nie chcąc zakładać nowego tematu, mam jeszcze pytanie odnośnie palindromów. Jak mogę przekształcić wyraz w dwa palindromy. Na wejściu zawsze będzie ciąg, z którego można stworzyć dwa identyczne palindromy. Np. będzie fraza laattool i chciałbym wyodrębnić po jednej sztuce każdego znaku. Tj w przypadku tego **laattool **do jednej zmiennej idzie po jednej literce (lato) a drugie lato do drugiej zmiennej. Próbowałem stringa jakoś posortować, lecz nie udaje mi się. Jakiej funkcji tu użyć?

1
string s;
cin>>s;
bool tb[256]={false};
string half;
for(string::iterator i=s.begin();i!=s.end();++i) if(tb[*i]^=true) half+=*i;
0

OK. Dziękuję bardzo. Korzystając z Waszych wskazówek rozwiązałem kolejne zadania - i utknąłem przy tworzeniu n-tego palindromu. Według mnie program działa w stu procentach, choć pewnie mnie znów zrugacie za zbyt długi i pokręcony kod. Starałem się jak mogłem. Ale mam do tego programu jedno ale: wysyłając zadanie na serwer, zdaje tylko 4/10 testów, przy reszcie dowiaduję się, że "zła odpowiedź". Gdybyście mogli rzucić okiem, co znowu schrzaniłem, byłbym wdzięczny :)

0

Ponawiam pytanie z poprzedniego postu :)

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