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.