En kolega har problem med följande kod : Koden ser onekligen korrekt ut... Hej! Jo...usch... skäms lite nu... Ja... men det är ju det... i anropet till "Vand" så är det naturligtvis en nollterminerad. Men returnerar strlen positionen efter '\0' eller positionen på '\0'? hehehe, Ja... fast hellre <ctring> isf. Hej igen! Jo...nu när du säger det, så...nu tror jag att allt klarnade igen... =) Det känner jag igen (att blanda i hop saker), när man hoppar från språk till språk.Revers på text fungerar ej..
#include <iostream>
#include <cstring>
using namespace std;
void vand(char *cp)
{
char *tp = cp + strlen(cp) - 1;
char c;
for (; cp < tp; cp++, tp--)
{
c = *cp;
*cp = *tp;
*tp = c;
}
}
int main()
{
char *cpek = "hej";
vand(cpek);
for (int i = 0; i < strlen(cpek); i++)
cout << *(cpek + i) << endl;
return 0;
}
Får nå minnes fel.. koden ska kasta om bokstäverna så det ska bli "jeh"..Sv: Revers på text fungerar ej..
Försök med standardgrejerna; skriv ut vad *cp och *tp är vid varje tillfälle.
och
for (int i = 0; i < strlen(cpek); i++)
cout << *(cpek + i) << endl;
känns änna onödig, varför ska bokstäverna va på olika rader?
kan ersättars med
cout << cpek << endl;
f.ö. så är det ju bättre att använda string i det här fallet, eftersom ni uppenbarligen kör C++.Sv: Revers på text fungerar ej..
Inte konstigt att ni får fel, här har ni lite hyss för er!!
<code>
*cp = *tp;
*tp = c;
</code>
Båda satserna försöker att göra samma sak, nämligen att tilldela ett värde (s.k. r-value) till ett värde.
Detta är blir fel då det ska vara ett adressvärde (s.k. l-value) till vänster om "=" tecknet i en tilldelning.
Det är därför som raden "c = *cp; " fungerar, då "c" representerar ett adressvärde.
* är i det här fallet en dereferens operator och returnerar ju värdet som cp och tp pekar på.
Programmet får sålunda ingen adress att lagra värdet på som du försöker att tilldela.
Till Niklas: Borde du inte ha sett detta ;-) ?
Hade du bråttom när du läste?
/HåkanSv: Revers på text fungerar ej..
Jag tänkte faktiskt tanken, men det blev väl typ "ja, ja, men nåt annat går väl inte att göra". Kollade mest på storleken.
Va ute igår, så jag e lite tom i bollen idag... =)
Nåväl; hur ska man nu göra... jag får inte riktigt ihop det i huvet, men det måste väl vara
cp = *tp;
tp = c;
isf?
Men det känns inte heller riktigt rätt.. .fan va det snurrar..
Jag håller ändå på idén om att köra med string. Argumenten mot att göra det är nästan obefintliga. Tar ytterst lite extra plats, är minnessäkra, är i regel snabbare än c-strängar.Sv: Revers på text fungerar ej..
Då får man ju i värsta fall köra med -2.
Och nu när jag tänker efter; ska det inte va *cp=*tp ändå?
om man skulle ändra cp med ett offset så skulle man ju inte kunna göra (cp+i)=*tp...
Nu har jag snurrat bort mig totalt... är så sällan jag använder c-strängar/vektorer. Som sagt; om ni kör C++, ska ni inte använda C-grejer.Sv: Revers på text fungerar ej..
nu kommer jag ihåg varför jag programmerar i vb ;-)
btw i string.h
finns ju en reversfunktion: strrev
om man ska envisas med använda char *
varför inte då köra med den? Sv: Revers på text fungerar ej..
Men som sagt; det är helt vansinnigt att använda C-strängar när man programmerar C++.Sv: Revers på text fungerar ej..
Niklas: Hoppas att du fått ordning på "bollen", och att det slutat att snurra.
>>Och nu när jag tänker efter; ska det inte va *cp=*tp ändå?
>>om man skulle ändra cp med ett offset så skulle man ju inte kunna göra (cp+i)=*tp...
Nej du kan inte skriva "*cp = *tp", eller rättare sagt du kan det för kompilatorn kommer inte klaga!!
MEN vid körningen så....................BOOM!! (testa själv).
Pekare kan som sagt bara innehålla EN sak, en minnesadress.
Med offset (pekararitmetik) kan du som sagt alltid ändra på en pekare (farligt farligt),
men då vet du som sagt inte heller var i minner den pekar!!
(menar bara en pekare, inte ett strängfält eller vanligt fält (array)).
Enda tilldelningarna du "kan" göra är:
cp = tp //pekare till pekare, de får samma adress.
cp = &c //adress till pekare, cp får samma adress som c.
Vet inte om jag sparkar in öppna dörrar, ni vet väl det här redan??!!
Håller med om att string är smidigare och säkrare.
Till Jarle: Ja det vill den.
Till Magnus: Precis, varför uppfinna hjulet på nytt!
/Håkan
Sv: Revers på text fungerar ej..
Jobbar för närvarande i VBA och har ganska nyss gått en kurs i Java, så det har minst sagt blivit att man har blandat ihop grejer...Sv: Revers på text fungerar ej..
/Håkan