Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Muuttujasta merkkijonon etsiminen [Katso, huono otsikko]

Sivun loppuun

Quirzo [16.11.2005 16:31:38]

#

void lataa_peli(void)
{
char savegame[100];
char ch1;

p("Savegame:\n");
s("%s",savegame);

ifstream sisaan(savegame);

//Luetaan tiedoston sisältö ja laitetaan se muuttujaan ch1
while (sisaan.get(ch1))
sisaan.close();

Eli miten saan tutkittua että mitä tiedosto sisältää.
Ja tehdä niin että: Jos ch1 sisältää 1234 niin printf("moi");

Jotenkin tollain... :E en osaa selittää.

PS:Olen aloittelija

Baglair [16.11.2005 17:09:19]

#

Selvennä vähän. En ymmärtäny mitä hait tossa. Toi koodikin näyttää aika virheelliselle sanoisin.

squid [16.11.2005 17:16:13]

#

Veikkaan, että jos tiedosto sisältää rvin 1234, niin ohjelma printtaa moi :)

Zach [16.11.2005 17:26:37]

#

#include <fstream>
#include <cstring>
...
ifstream sisaan("filu.txt");
char* ch1;
sisaan >> ch1;
if (strcmp(ch1, "1234")) cout << "Moi";

Tämä lukee tiedoston ensimmäisen "sanan", lopettaa siis 1. väliin.

p("Savegame:\n");
s("%s",savegame);

Mitä tämän on tarkoitus tehdä?

Quirzo [16.11.2005 17:42:47]

#

Tuosta tulee pelini tallenuksen lataus.
Alussa kysytään tallennuksen nimeä.
Ai niin unohdin kertoa :(
s = scanf
p = printf
Tein tuollaiset pikajutut.

Metabolix [16.11.2005 21:13:30]

#

Tässä tavallinen hidas versio:

int etsi_teksti(char * alkuteksti, char * etsittava)
{
  int i, j;

  /* Katsotaan joka kohdasta tekstin loppuun asti */
  for (i = 0; alkuteksti[i] != 0; i++)
  {
    /* Verrataan kaikkia etsittävän merkkejä alkutekstiin */
    for (j = 0; etsittava[j] == alkuteksti[i+j] && etsittava[j] != 0; j++);
    /* Jos päästiin etsittävän loppuun asti, palautetaan kohta */
    if (etsittava[j] == 0)
      return j;
  }
  /* Jos ei löytynyt, palautetaan -1 */
  return -1;
}

Kai se meni oikein, taas kerran suoraan tänne kirjoitettuna... Tuosta on kyllä sitten praempiakin versioita, mutta ne saat ihan itse etsiä (tai keksiä, mikä ei ole lainkaan mahdotonta).

uffis [19.11.2005 21:53:25]

#

Zach: Jos en ole aivan väärin ymmärtänyt, ei merkkiosoittimelle ch1 ole varattu muistia, joten tuo lukuoperaatio ei ole kovinkaan turvallinen.

Ei kannata keksiä pyörää uudelleen, ellei tarkoitus ole harjoitella merkkitaulukoiden käyttöä ja käyttäytymistä.

Kun kerran C++:sta on kyse, kannattaa opetella samantien string-luokan käyttö, niin pääsee huomattavasti vähemmällä. Merkkijonojen etsiminenkin helpottuu, vaikka olisihan siihen ollut merkkitaulukoita ja -osoittimia käytettäessä tarjolla C-kielestä tuttu strstr-funktio.

Merkkijonon lukemiseen käyttäjältä on olemassa funktio getline(istream, string).

Metabolix [19.11.2005 22:43:40]

#

Ja näin tarkemmin kun katsoo, niin alkuperäinen koodi ei taas kerran ole tuohonkaan asti toimiva. While-lause on varsin mielenkiintoinen. Kannattaisi varmaankin tutustua vähän tarkemmin siihen, paljonko tavaraa yhteen char-muuttujaan mahtuu.


Sivun alkuun

Vastaus

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

Tietoa sivustosta