C++
Antakaa funktio tai mahdollisesti funktio ja esimerkki koodi siitä miten muuttujasta voi ottaa esim. sanan, kiitos. Selvennys: Jos muuttujassa olisi vaikka teksti "ohjelmoi palikkapeli" niin miten tuosta voi ottaa yhden (tai kaikki) peli sanan pois?
Standardikirjastoista ei löydy ainakaan valmista funktiota, mutta johdetaanpas:
Funktio strstr(char *, char *) etsii merkkijonoa toisesta, palauttaa osoittimen tutkitun merkkijonon kohtaan josta etsitty merkkijono alkaa (siis etsityssä merkkijonossa). Jos ei löydy, palauttaa NULL. Kasataan siitä eteenpäin (Huom: testaamatonta koodia, suoraan pohjattomasta hatusta, poistaa etsityn sanan ensimmäisen ilmentymän lauseesta. Helppo jatkomuokata.)
char * CutOffWord(char * lause, char * sana){ char *temp; //osoitin char tulos[255]={0}; int a=0, alku; temp = strstr(lause, sana); if(temp){ //löytyi... siispä etsitään, ja poistellaan //eli temp osoittaa paikkaa, josta sana alkoi (muistissa), jolloin siis //temp - lause = paikka lauseessa, josta merkkijono alkaa. //loopataan siitä sanan pituus eteenpäin kopioimatta. alku = lause - temp; //sijainti merkkinonossa for(a=0;a<alku;a++){ //kopioidaan merkit ennen alkua tulos[a] = lause[a]; } a += strlen(sana); //skipataan kopioinnissa ja kopsataan loppu for(;a<strlen(lause);a++){ //kopioidaan loput merkit tulos[a] = lause[a]; } }else tulos = lause; return tulos; }
No hieman tuntuu, että olisi pohjattomasta hatusta. En saanut toimimaan tuota Devillä ainaskaan. Saattaako johtua kääntäjästä, mutta joka tapauksessa tarvitsen toimivaa esimerkkiä :D.
Kai muistit includetella tarvittavat eli string.h. Ja niitä virheilmoituksia olisi hyvä myös kertoa.
Eli tarvitsenkos vain iostreamin ja string.h? Virheilmoituksia pistelen kun taas testailen tuota koodia.
No nyt:
Virheitä: 21 untitled1.cpp assignment to `char' from `char *' lacks a cast ----------------------------------------------- Varoituksia: 5 untitled1.cpp warning: address of local variable `tulos' returned
Noo, laitoin sen itse loppuun. Tuossa tulee ikävästi muistin ohiviittauksia etc, joten kirjoitin sen itse kokonaan uusiksi. Periaate on kuitenkin sama. Toimii kuin unelma ainakin borlandc:llä.
#include <string.h> #include <stdio.h> int CutOffWord(char * lause, char * sana){ char * temp; int a, alku, loppupituus; temp = strstr((char*)lause, sana); if(temp){ //löytyi mokoma loppupituus = strlen(temp) - strlen(sana); //loppuosuuden pituus alku = temp-lause; //alkukohta for(a=0;a<loppupituus+1;a++){ //kopioidaan myös viimeinen \0-merkki lause[a+alku] = lause[a+alku+strlen(sana)];//kopioidaan jälleen, skipataan etsitty sana } return -1; }else return 0; //ei löytynyt } int main(){ char * lause = "Palikkapeli rulaa!", * sana = "peli"; printf("%s\n",lause); if( CutOffWord(lause, sana) ){ //löytyi, mokoma printf("%s\n",lause); } return 0; }
Aihe on jo aika vanha, joten et voi enää vastata siihen.