Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Apua merkkijonosotkuun

Sivun loppuun

DumTom [18.05.2009 16:06:59]

#

Eli käytän sen verran vanhaa dos-kääntäjää joka ei tue stringejä.
Homman nimi on seuraava:On kartta jossa asuinpaikkoja.
Niitä etsitään silmukalla ja merkataan aina x ja y koordinaatti globaaliin struktuuriin muistiin.
Tässä ei ongelmia.
Mutta sitten kun pitäisi valita asuinpaikan perusnimi tulee ongelmia.
Eli jotenkin näin olen tehnyt.

char nimi[15];
if (a==0) strcpy(nimi,"HUT");
if (a==1) strcpy(nimi,"VILLAGE");
if (a==2) strcpy(nimi,"TOWN");
if (a==3) strcpy(nimi,"FORT");

Okei,toihan toimii tähän asti hienosti mutta sitten pitäisi siirtää toi nimi merkkijono globaaliin taulukkoon joka on muotoa:

G.DWELNAME[10][100]

tai sitten

G.DWELNAME[100][10]

en ole varma kumpaa noista pitäisi käyttää,tarkoitus olisi että olisi mahikset sataan asuinpaikkaan ja 10 merkkiä olisi varattu nimelle.
Olen yrittänyt seuraavaa:

strcpy(G.DWELNAME[mones],nimi);

Ei toimi.
Mikä olisi ratkaisu?
Siis pelkkiä C-funktioita käyttäen.

miiro [18.05.2009 18:39:52]

#

Hanki uudempi kääntäjä.

Blaze [18.05.2009 18:40:52]

#

DumTom kirjoitti:

Eli käytän sen verran vanhaa dos-kääntäjää joka ei tue stringejä.

Umm, djgpp? Jos nyt siis on ihan pakko saada koodata obsoleetille, 30 vuotta vanhalle, käyttikselle.

Metabolix [18.05.2009 18:50:02]

#

typedef char NIMI[10];
NIMI DWELNAME[100];
strcpy(DWELNAME[0], nimi);

Eikö toimi? Miten ei toimi? Tuleeko jokin virheilmoitus? Missä vaiheessa?

Torgo [18.05.2009 19:39:17]

#

Kaatuuko jo käännöksessä vai vasta ajon aikana? Jos käännöksessä, niin mitä kääntäjä sanoo? Periaatteessa koodisi näyttäisi olevan oikein, joten luultavasti ongelma on tuon G-struktin kanssa.

Metabolixin esittämä tapa pitäisi toimia. Tosin turvallisempaa olisi käyttää strncpy:ä tähän tapaan:

strncpy(DWELNAME[0], nimi, 9);

Tai mihin tahansa tapaan, mikä määrittää stringin maksimikoon ohi-indeksoinnin estämiseksi. Nythän sinulla "nimi" on 15 merkkiä ja kohde 10 merkkiä (mukaanlukien '\0').

DumTom [19.05.2009 11:26:28]

#

Ei tosiaan ole kaksiulotteiselle char taulukolle muuta tapaa kuin toi Metabolixin kummajainen?

for (short t=0;t<10;t++)
    {
    DWELNAME[0][t]=nimi[t]
    }

Voiskohan toi toimia?

Ja kumminpäin toi taulukko pitää alustaa?

char DWELNAME[100][10]

vai

char DWELNAME[10][100]

vehkis91 [19.05.2009 11:45:04]

#

char DWELNAME[100][10];

Jos kerta haluat 100 eri nimeä, jotka ovat 10 merkin pituisia.

DumTom [19.05.2009 19:32:41]

#

Kiitoksia kaikille.Naputtelen yöllä ton Metabolixin jutskan.

Torgo [20.05.2009 10:52:28]

#

DumTom kirjoitti:

Ei tosiaan ole kaksiulotteiselle char taulukolle muuta tapaa kuin toi Metabolixin kummajainen?

Tapoja on paljonkin, mutta tuo Metabolixin "kummajainen" on hyvin selkeä. Ensin määritetään typedefillä uusi tyyppi NIMI, joka on 10 merkistä koostuva merkkijono. Sitten varataan DWELNAME-taulukko joka sisältää 100 NIMI-tyyppistä alkiota (eli 10 merkin pituista merkkijonoa). Sitten vain kopioidaan käsiteltävä merkkijono taulukon ensimmäiseen alkioon strcpy:llä. Toki voit tehdä tuon ilman tyyppimäärittelyjäkin varaamaalla merkkijonotaulukon suoraan:

char DWELNAME[100][10];

DumTom kirjoitti:

for (short t=0;t<10;t++)
    {
    DWELNAME[0][t]=nimi[t]
    }

Voiskohan toi toimia?

Toki (jos lisäät puolipisteen), mutta jos nimen pituus on 10 tai suurempi, sinulta jää lopetusmerkki uupumaan. Se ei sinällään haittaa jos otat sen muualla ohjelmassa huomioon tai lisäät sen sinne itse:

DWELNAME[n][9] = 0;

Toinen vaihtoehto on alustaa DWELNAME nollaksi ja huolehtia ettei viimeistä merkkiä koskaan kirjoiteta.

DumTom [20.05.2009 14:14:29]

#

Sain homman toimimaan viime yönä.
Kiitosta vaan Torgollekkin...


Sivun alkuun

Vastaus

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

Tietoa sivustosta