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
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
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); }
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;
Kappas, putosin itse ihan samaan kuoppaan, josta muitakin varoittelin
nick[n] = 0;
Pitää tietysti olla
nick[maxlen] = '\0';
Paha moka! :-)
Ää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. :-)
Aihe on jo aika vanha, joten et voi enää vastata siihen.