Archief - C++: string append doet vreemd

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

G@medude

Legacy Member
Hey,
ik zit hier met een vreemd probleemp. Misschien weten jullie hoe dit komt.
Het probleem is als volgt. Met deze code krijg ik het juiste resultaat:
Code:
string path("/exports/home/wvrossem/pop3/maildrops/"+player->name()+"/");
cout << path ;
Code:
Output: /exports/home/wvrossem/pop3/maildrops/wvrossem/
Maar als ik het eerste path vervang door het field _folder_path, krijg ik dit vreemde resultaat. Dus
Code:
string path(_folder_path+player->name()+"/");
cout << path ;
Code:
Output: wvrossem/home/wvrossem/pop3/maildrops/
Dus inplaats van de username achternaam het path te appenden, gaat append nu het begin van de tekst gaan overschrijven. Iemand enig idee hoe dit komt?

G@medude

Legacy Member
hmm nee, _folder_path is een string. Daarom vind ik het ook zo vreemd
Code:
std::string _folder_path;

MAXXUR

Legacy Member
Als ik het goed heb: de compiler ziet uw "/" als gewone char pointer, waardoor er pointer arithmetics worden toegepast via die + in plaats van de append operator. Right?

forloRn_

Legacy Member
Nah. Ten eerste is er maar één pointer in het spel, en ten tweede kan je geen twee pointers optellen, enkel aftrekken.

Is hij echt tekens aan het overschrijven, of lijkt het alleen maar zo omdat "/exports" even lang is als "wvrossem"?

Tyfius

Legacy Member
Zeker dat ge nergens iets niet verkeerd aan het doen zijt?

Code:
#include <iostream>
#include <string>

using namespace std; // Sue me.

class Player
{
    public:
        Player() { this->my_name = "wvrossem"; }
        string name() { return this->my_name; }

    private:
        string my_name;
};

int main(void)
{
    Player* player = new Player();
    string folder_path = "/exports/home/wvrossem/pop3/maildrops/";

    string path(folder_path + player->name() + "/");

    cout << "Path: " << path << endl;

    delete player;
}
Code:
jensen@atlantis:~/Desktop/cpptest$ g++ test.cpp 
jensen@atlantis:~/Desktop/cpptest$ ./a.out 
Path: /exports/home/wvrossem/pop3/maildrops/wvrossem/
Of heb ik hier iets verkeerds voor?

MAXXUR zei:
?

G@medude

Legacy Member
forloRn_ zei:
Nah. Ten eerste is er maar één pointer in het spel, en ten tweede kan je geen twee pointers optellen, enkel aftrekken.

Is hij echt tekens aan het overschrijven, of lijkt het alleen maar zo omdat "/exports" even lang is als "wvrossem"?

Nee, als de naam van de player bvb "test" is, zal het path als volgt zijn
Code:
test/rts/home/wvrossem/pop3/maildrops
De "/" maakt ook niet zoveel uit, als ik die weglaat krijg ik nog steeds de fout.

@Tyfius: youw code geeft iderdaad het gewenste resulaat, mss doe ik inderdaad ergens iets fout.

Zou het misschien aan de name() method liggen?
Code:
const std::string& name () const
  {
    return name_;
  }

Alvast bedankt

forloRn_

Legacy Member
G@medude zei:
Zou het misschien aan de name() method liggen?
Code:
const std::string& name () const
  {
    return name_;
  }

Alvast bedankt

Nee, die is redelijk perfect geschreven. Je zult wel iets verkeerd doen; print die dingen eens af vooraleer je ze aan elkaar plakt.

Tyfius

Legacy Member
Trouwens, nog een tip. Het gebruik van een _ als prefix voor een variabele (hier uw _folder_path) of functie wordt afgeraden en is voorbehouden voor compiler implementaties. 't Is niet verboden maar eerder als rule of thumb te onthouden.

Dit even terzijde. Met uw name functie is inderdaad niets mis. Druk inderdaad eens wat informatie af of, debug er gewoon eens door als je een IDE gebruikt.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan