Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: cinin teksti

remontti-reiska [20.02.2004 20:23:37]

#

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?

sqwiik [20.02.2004 20:48:07]

#

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;
}

remontti-reiska [20.02.2004 21:22:12]

#

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.

thefox [21.02.2004 00:44:50]

#

Kai muistit includetella tarvittavat eli string.h. Ja niitä virheilmoituksia olisi hyvä myös kertoa.

remontti-reiska [21.02.2004 10:54:28]

#

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

sqwiik [21.02.2004 13:29:10]

#

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;
}

Vastaus

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

Tietoa sivustosta