[Ansi C] String functies

Pagina: 1
Acties:
  • 126 views sinds 30-01-2008
  • Reageer

  • Ti_Uhl
  • Registratie: Mei 2003
  • Laatst online: 19-09-2012
hallo,

Ik ben als voorbereiding op het examen C een oefening aan het maken die een kaartspel simuleert. Het is de bedoeling dat de gebruiken een kaart aanduid en dat ik vervolgens random kaarten ga trekken uit de boek kaarten totdat ik de kaart gevonden heb.

Ik zit echter vast met het concateneren van een string met een integer waarde.
Ik heb al geprobeerd om gewoon :

code:
1
str = "harten " + kaart.waarde;


te gebruiken maar dat werkt niet. Na even te zoeken op google vond ik enkele string functies maar deze willen het ook niet doen. Nu komt er de kleurwaarde op maar niet de waarde van de kaart. omdat die telkens een fout geeft op de strcat functie :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void kaart_to_string(KAART kaart, char* str){
    /*vul aan */
        char s[15];
        switch (kaart.kleur) {
          case harten :
            strcpy(str,"harten "); // + kaart.waarde;
            break;
          case schoppen :
            strcpy(str,"schoppen ");// + kaart.waarde;
            break;
          case ruiten :
            strcpy(str,"ruiten ");// + kaart.waarde;
            break;
          case klaveren : 
            strcpy(str,"klaveren ");// + kaart.waarde;
            break;
        }
}


Voor de volledigheid kan je hier de volledige code vinden van het programma.

Ik weet dat ik even goed met een return value zou kunnen werken maar dat zou willen zeggen dat de opgave veranderd moet worden en dat is niet de bedoeling.

kaart.waarde is zoals je in de volledige source kan zien een integer waarde en daar wringt hem het schoentje volgens mij, ik heb ook al geprobeert om itoa() te gebruiken maar dat geeft ook errors :s

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

ik heb ook al geprobeert om itoa() te gebruiken maar dat geeft ook errors
Dat geeft ook errors.... oooh natuurlijk, het is me meteen duidelijk wat er fout gaat. Not ;). Wees duidelijk in je omschrijving, geef aan welke errors je krijgt en wat de exacte code is waarmee je itoa aanroept. Itoa is overigens geen Ansi C.

Maar het lijkt erop dat je nog even met je neus de boeken in moet, vooral over wat een string nou precies is. Standaard strings in C worden gerepresenteerd door een pointer naar het eerste element, en de string wordt afgesloten door een \0 char. Functies als strcpy en strcat kopieren naar een stuk geheugen, en je moet daarom ook zorgen dat je zeker weet dat het resultaat in het voor die string gereserveerde geheugen gaat passen.

Je zou hier overigens wellicht beter s(n)printf kunnen gebruiken, dan kun je een string opbouwen uit verschillende elementen zoals andere strings en numerieke typen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Ti_Uhl
  • Registratie: Mei 2003
  • Laatst online: 19-09-2012
ik heb sprintf eens opgezocht en in theorie zou het mij kunnen helpen, echter in de praktijk geeft dit ook een error :

code:
1
 str = sprintf("harten %d",kaart.waarde);


zo roep ik hem op en dit geeft hij als error :

code:
1
2
3
inh2-opg.c: In function `kaart_to_string':
inh2-opg.c:103: warning: passing arg 2 of `sprintf' makes pointer from integer without a cast
inh2-opg.c:103: warning: assignment makes pointer from integer without a cast


wat resulteert in een programma dat een seg. fault geeft :s

In de TS staat ook een url naar de volledige source, daar kan je zien dat kaart.waarde een integer is.

Als ik die sprintf verander in een gewone printf zodat hij die string op het scherm afdrukt werkt het echter wel :s

[ Voor 11% gewijzigd door Ti_Uhl op 30-05-2005 14:12 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Kijk nog eens goed naar hoe je sprintf moet aanroepen

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Ti_Uhl
  • Registratie: Mei 2003
  • Laatst online: 19-09-2012
ik heb deze informatie gevonden op volgende site : hier en die het exact hetzelfde als hoe het daar staat. Ik heb ook al geprobeert de quote's te veranderen in een single quote zoals het daar staat maar dat veranderd niets aan de errors.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Uh, right
MATLAB Functions
Dat is geen ANSI C documentatie hoor :)

[ Voor 3% gewijzigd door .oisyn op 30-05-2005 14:22 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Ti_Uhl
  • Registratie: Mei 2003
  • Laatst online: 19-09-2012
code:
1
sprintf(str,"harten %d",kaart.waarde);


zo werkt het :D :D :D
thx voor het duwtje in de goede richting :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

_o_
En als je je zorgen maakt over veiligheid (wat als het resultaat helemaal niet in het stukje geheugen waar str naar wijst past?) zou je snprintf kunnen gebruiken, dan kun je een maximale lengte meegeven en weet je dus zeker dat je geen overflow zult krijgen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

En verder is er natuurlijk nog strcat, waarmee je 2 strings aan elkaar plakt. (Al vind ik sprintf mooier. :P)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Nou ja, snprintf ... je weet PRECIES hoe lang de string maximaal kan worden, nl

sizeof("harten %d") + (sizeof(int)*CHAR_BIT*3/10)

(en in de praktijk is waarde>=0, dus -1 omdat je geen '-' nodig hebt)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02-05 01:32
Hoe de fuck kom je nu weer aan die expressie? (Overigens is het hier veel simpeler; want het lijkt me dat de waarde van kaarten beperkt is tot twee cijfers.)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:45

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat is het aantal digits dat je nodig hebt voor een x aantal bits (je berekent dus x * 10log 2). Het klopt alleen niet want die "%d" wordt ook meegeteld ;)

[ Voor 8% gewijzigd door .oisyn op 30-05-2005 18:11 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 02-05 01:32
Aha ok, die 3/10 is dus een benadering van 10log(2). Dat was uit de context niet helemaal duidelijk. :)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
.oisyn schreef op maandag 30 mei 2005 @ 18:10:
Dat is het aantal digits dat je nodig hebt voor een x aantal bits (je berekent dus x * 10log 2). Het klopt alleen niet want die "%d" wordt ook meegeteld ;)
* MSalters is evil

Ik tel de %d mee, maar de correcte formule heeft nog een +2 (sign, en 2^10 is10^3 is 4 cijfers) die wegstreept tegen de %d.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1