Diskuze: ulozeni string do char[]

C++ C a C++ ulozeni string do char[]

Avatar
Mike057
Člen
Avatar
Mike057:

ahoj. poradite mi nekdo jak udelat toto?

mam stukturu:

struct namelist
        {
          char names[10][8];
          int scores[10];
        };

namelist scoreboard;

no a pak potrebuju udelat tohle:

scoreboard.names[0] = "jmeno";

nevite jak to ma byt spravne? takhle to nefunguje :( dekuji za odpovedi :)

 
Odpovědět 23.2.2013 14:28
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Mike057
David Čápka:

string má metodu ToCharArray. K čemu to potřebuješ?

Nahoru Odpovědět 23.2.2013 14:32
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Mike057
Člen
Avatar
Mike057:

jo este doplnim ze nepouzivam string protoze potrebuju aby ta struktura mela nemenou velikost.

no je to tabulka score a ja pak celou tu strukturu ukladam do souboru... proto potrebuju aby se nemenila veikost s bytech. kvuli nacitani

Editováno 23.2.2013 14:34
 
Nahoru Odpovědět 23.2.2013 14:33
Avatar
Mike057
Člen
Avatar
Odpovídá na David Čápka
Mike057:

a jak ta metoda funguje? me ji to vubec nenabidne :( a kdyz ji tam napisu tak to vyhodi chybu

 
Nahoru Odpovědět 23.2.2013 14:38
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Mike057
David Čápka:

To vymýšlíš nějakou prasárnu. Zaprvé string jde normálně serializovat do binárního souboru a zadruhé je vhodnější použít např. XML.

Jo až teď jsem si všiml že to není C# :D Si udělej metodu co ti převede string na pole znaků.

Editováno 23.2.2013 14:40
Nahoru Odpovědět 23.2.2013 14:39
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Mike057
Člen
Avatar
Mike057:

c++ :D no asi mi nic jinyho nezbyde :/

 
Nahoru Odpovědět 23.2.2013 14:46
Avatar
Odpovídá na Mike057
Lukáš Hruda (Luckin):

Můžeš místo = používat funkci strcpy, ta ti překopíruje řetězec tam kam potřebuješ. Pokud to chceš dělat pohodlněji, tak si pro ten řetězec udělej třídu, která bude používat statický pole o velikosti kterou potřebuješ pro uložení toho řetězce a pak jí stačí přetížit operátor = tak, aby ti ten řetězec překopíroval přesně jak potřebuješ.

 
Nahoru Odpovědět 23.2.2013 14:57
Avatar
Odpovídá na Mike057
Lukáš Hruda (Luckin):
class Name
{
  private:
    static const int size = 8;
    char name[size];

  public:
    Name(){}
    Name(char*);
    const Name & operator=(char*);
    char & operator[](int i){return name[i];}
    operator char*(){return name;}
};

Name::Name(char* str)
{
  int i;
  for(i=0;i<size-1 && i<strlen(str);i++)
    name[i] = str[i];
  name[i] = '\0';
}

const Name & Name::operator=(char* str)
{
  int i;
  for(i=0;i<size-1 && i<strlen(str);i++)
    name[i] = str[i];
  name[i] = '\0';
  return *this;
}

A pak napíšeš:

struct namelist
{
  Name names[10];
  int scores[10];
};

namelist scoreboard;

scoreboard.names[0] = "jmeno";  //tohle ale musí být uvnitř funkce
 
Nahoru Odpovědět  +1 23.2.2013 15:19
Avatar
Mike057
Člen
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Mike057:

Parada dekuju moc to je presne ono co sem potreboval :)

 
Nahoru Odpovědět 23.2.2013 16:15
Avatar
Mike057
Člen
Avatar
Mike057:

tak mam este jeden problem :/ nemuzu to zaboha vypsat

string jmeno = scoreboard.names[0];

textprintf_ex(buffer,font_names_xs,x+8,y+38,makecol(255,153,0),-1,"%s",jmeno);

tohle vyhazuje chybu. zniceho nic promena jmeno nic neobsahuje ale kdyz zmenim %s na %d tak to normal vzpise ale jak cisla :/

 
Nahoru Odpovědět 23.2.2013 17:34
Avatar
Odpovídá na Mike057
Lukáš Hruda (Luckin):

Ta třída nemá definovanou konverzi na string. Ale má definovanou konverzi na char*, takže buďto můžeš dosadit rovnou scoreboard.names[0] do textprintf_ex, nebo změň string na char*. Nehledě na to že textprintf_ex může jako parametr přebírat char*, ale jelikož je to Céčková funkce a v C nexistuje string a zároveň string nemá definovanou konverzi na char*, tak do textprintf_ex vůbec nemůžeš dávat string.

 
Nahoru Odpovědět 23.2.2013 17:55
Avatar
Mike057
Člen
Avatar
Mike057:

:D aha no kdyz tam dam rovnou scoreboard.names[0] tak to stejne vyhodi chybu... a jestli to neumi string tak co tam mam zdat za to % ?

 
Nahoru Odpovědět 23.2.2013 18:04
Avatar
Mike057
Člen
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Mike057:

aha uz to mam sem uplne pitomej :D dik moc

 
Nahoru Odpovědět 23.2.2013 18:07
Avatar
Odpovídá na Mike057
Lukáš Hruda (Luckin):

Normálně %s, v C se stringem myslí pole znaků ke kterýmu se přistupuje přes char*, v C++ vlastně taky, string neni základní datovej typ. A co to hází za chybu??

 
Nahoru Odpovědět 23.2.2013 18:12
Avatar
Mike057
Člen
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Mike057:

no accesvolation ci jak se to pise... a kdyz sem se kouknul na promeny ty struktury tak to psalo ze neplatnej ukazatel... nicmene kdyz se to udela bez toho s a da se to tam rovnou tak to funguje :)

 
Nahoru Odpovědět 23.2.2013 20:10
Avatar
Odpovídá na Mike057
Lukáš Hruda (Luckin):

I přes to %s to funguje, jenom to musíš explicitně přetypovat, (char*)scorebo­ard.names[0]. Alespoň u printf to funguje, v allegru by mělo taky.

 
Nahoru Odpovědět 23.2.2013 20:48
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 18 zpráv z 18.