Seuraavan funktion tarkoitus olisi kääntää char taulukko ylösalaisin.
char* Reverse(char* Data, long Size) { long x = Size-1; long Length = Size/2; for (long i = 0; i < Length; i++) { static char Temp = Data[x]; Data[x] = Data[i]; Data[i] = Temp; x--; } return Data; }
Eli ongelmana on, että miten saan siirrettyä Temp muuttujan arvon Data[i]:hin ilman, että Data[i] arvo muuttuisi viimeiseksi Temp:in arvoksi. Onko moinen edes mahdollista?
Esim. jos käännetään "testiä", niin siitä tulee "äääset".
Tiedän, että homma hoituisi toisella taulukolla, mutta se on todella hidasta suurilla taulukoilla verrattuna tuohon.
Vai onko muita ehdotuksia?
PS. Jos joku ihmettelee miksi en käytä stringiä ja miksi funktioon pitää lisätä taulukon koko, niin taulukolla täytyy olla mahdollisuus sisältää esimerkiksi \0 eli NULL arvo.
Kiitos jo etukäteen!
Käytä väliaikaissäilöä, jonka avulla vaihdat kirjaimet sen sijaan että käyttäisit tuota x:ää. Esimerkkiä:
char Tmp; for(i=0;i<Lenght;i++){ Tmp = Data[i]; Data[i] = Data[Length-i-1]; Data[Length-i-1] = Tmp; }
Ei toiminut sqwiik.
Jos ymmärsin tuon koodin oikein, niin koita ottaa tuo static sana pois.
Tässä tulee C-kielinen esimerkki, joka toimii juuri samalla tavalla kuin sqwiikin kirjoittama koodinpätkä. Jos tietyn arvon pystyy laskemaan helposti suoraan ja sitä tarvitsee vain kerran tai kaksi, erillinen muuttuja ei yleensä ole tarpeen vaan laskutoimituksen voi kirjoittaa sellaisenaan. Tässä tapauksessa merkkijonon pituuden puolikkaan voi kirjoittaa for-silmukkaan suoraan, samoin taulukon indeksin merkkijonon toisessa päässä pystyy laskemaan helposti vähentämällä silmukan laskurin arvon merkkijonon pituudesta.
#include <stdio.h> void kaanna(char teksti[], int pituus); int main(void) { char teksti[] = "Morjens!"; kaanna(teksti, 8); printf("%s", teksti); return 0; } void kaanna(char teksti[], int pituus) { int i; char vaihto; for (i = 0; i < pituus / 2; i++) { vaihto = teksti[i]; teksti[i] = teksti[pituus - i - 1]; teksti[pituus - i - 1] = vaihto; } }
for (i = 0; i < (Length / 2); i++) { Temp = Data[Length - i - 1]; Data[Length - i - 1] = Data[i]; Data[i] = Temp; } /* T E S T I S A N A => A E S T I S A N T => A N S T I S A E T => A N A T I S S E T => A N A S I T S E T Huh huh, kun oli hankalaa. */
Kas, Antti ennätti edelle.
Kun Sqwiik lukee koodiaan, hän varmaan ymmärtää virheensä: Kun päästään puoleen väliin, sana on käännetty, ja kun mennään loppuun asti, se kääntyy jo takaisin :)
Hmmm... Miksiköhän minulla koodinne eivät toimi (ei osaa kääntää sanaa oikein; esim. "testiä" => kuusi kirjainta *epämääräistä sotkua*)? Kääntäjänä on Dev-Cpp.
PS. Metabolix, alunperin koodini oli lähes samankaltainen.
Edit:
Huomasin, että "Test" => "tseT", mutta jos teksti sisältää muita kuin tavallisia merkkejä; esim. "\0", niin funktio ei osaa enää kääntää kunnolla.
Selvisi ainakin mistä merkistä toi ei pidä (en kyllä tiedä syytä). Merkki 255 eli ÿ sekoittaa koko kääntäjän. Kaikilla muilla merkeillä kääntäjä toimii. Miten korjata vika?
Edit:
Tossa vielä koodi:
char* Reverse(char* Data, long Size) { long Length = Size/2; int Temp = 0; for (long i = 0; i < Length; i++) { Temp = Data[Size-i-1]; Data[Size-i-1] = Data[ i ]; Data[ i ] = Temp; } delete &Temp; return Data; }
Huomasin, että kun käänsin käännetyn tekstin uudelleen niin se toimi. Tätä ennen tarkistin käännetyn tekstin notepädillä. Kiitos vaivannäöstä teille :).
Aihe on jo aika vanha, joten et voi enää vastata siihen.