Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Tekstin alusta tiettyyn merkkiin

Freeze [29.11.2006 21:12:24]

#

Mulla olis ongelma, et miten saa etsittyä esim:
Nick!Ident@Host lauseesta tiettyyn merkkiin (huutomerkki) asti, ja sitten laittamaan ton Nick johonkin muuttujaan? Oon koko päivän ettiny eikä oo löytyny että tiedättekös te? :P

Andu [29.11.2006 21:41:56]

#

Jos se on char taulukossa (esim. char teksti[100]), niin eikös se mene kutakuinkin näin:

int i;
char teksti[100] = "Nick!Ident@Host";
char nick[50];

for(i = 0; i < 100; i++)
{
    if (teksti[i] == "!") break;
    else nick[i] = teksti[i];
}

E:
Tämä siis C++:la

Metabolix [29.11.2006 23:11:10]

#

std::string nick, teksti;
std::string::size_type paikka;

paikka = teksti.find_first_of('!');
if (paikka == std::string::npos) {
    // Ei löytynyt
} else {
    nick = teksti.substr(0, paikka);
}

http://www.cppreference.com/cppstring/index.html

koo [30.11.2006 00:18:55]

#

Freeze kirjoitti:

Oon koko päivän ettiny eikä oo löytyny

Voisi vissiin etsiä vähän paremminkin. Jostakin oppikirjasta voi löytyä hyvinkin, mutta jos vähänkin tietää, mitä hakee, niin sitten täältä löytyy aika kivasti.

EDIT: Vielä noista esimerkkipätkistä. Tuossa Andun koodissa on tavallista C-tautia: Jos huutomerkkiä ei löydy, niin saatetaan surutta kirjoittaa kohdetaulukon ohi, ja jos huutomerkki löytyy, niin merkkijonoa ei lopeteta. Ja if-lauseen ehdossa pitää olla '!' eikä "!", mutta siitä nyt kääntäjäkin ymmärtää valittaa.

Metabolixin pätkässä on hyvä meininki. Sitä voisi vielä vaikka tiivistääkin ja silti se on ihan luettavaa, vaikka näin:

string teksti = "Nick!Ident@Host";
string nick = teksti.substr(0, teksti.find('!'));

Jos täytyy käyttää merkkitaulukoita, niin sitten mieluusti vaikka näin:

char const *teksti = "Nick!Ident@Host";
size_t const maxlen = 50;
char nick[maxlen+1];
size_t n = std::strcspn(teksti, "!");
strncpy(nick, teksti, min(maxlen, n));
nick[n] = 0;

koo [30.11.2006 09:39:38]

#

Kappas, putosin itse ihan samaan kuoppaan, josta muitakin varoittelin

nick[n] = 0;

Pitää tietysti olla

nick[maxlen] = '\0';

Paha moka! :-)

koo [30.11.2006 11:02:20]

#

Ääh, nyt menee jo hapoille ja yksinpuheluksi. Ei tuo mokapaikkaus noinkaan mene, otetaanpa ihan hitaasti:

char const *teksti = "Nick!Ident@Host";
size_t const maxlen = 50;
char nick[maxlen+1];
size_t n = min(std::strcspn(teksti, "!"), maxlen);
strncpy(nick, teksti, n);
nick[n] = '\0';

C-tyylinen merkkijonopuljaus on vaarallista. :-)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta