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.