[C] Pointer vanuit structure naar "string"

Pagina: 1
Acties:

  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 24-10 20:19
Dit is vast een vrij basic vraag voor maar ik kom er niet uit.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <sdio.h>;
#include <string.h>;
char string_array[][20] = {"regel1", "regel2"};
char *p;

typedef struct{
char array[20];
} TEST;

TEST test;
p = string_array[0];
printf("%s\n", p);
test.array = p;
printf("%s\n",test.array);
return 0;


Wat gaat hier mis? De eerste printf geeft netjes "regel1"; de 2e alleen maar random bagger. De bedoeling is dus dat test.array netjes naar of string_array[X] wijst.

Wat ik eigenlijk eerst wilde doen is:

code:
1
test.array = string_array[0];

Ik kwam erachter dat dat niet ging werken. fout was "incompatible types in assignment". De oplossing was of strcopy gebruiken of pointers. Waarbij pointers de voorkeur hebben.

[ Voor 72% gewijzigd door Gehakt op 15-11-2006 12:55 . Reden: Post is nog niet af drukte perongeluk op submit; moment ]


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Aan die code is iig niets fout, maar ik wacht nog even de rest van je post af ;)

Compilet regel 13 überhaupt? Want dat mag helemaal niet. test.array is een array, geen pointer. Je kunt 'm dan ook geen andere waarde toekennen. Je zou evt. de string kunnen kopiëren naar de array (zie strcpy() en aanverwanten), maar in je post zeg je dat die array naar de string moet wijzen. Dan moet je hetzelfde doen als je met pointer doet, namelijk een char* definieren ipv een char[20].

[ Voor 71% gewijzigd door .oisyn op 15-11-2006 12:54 ]

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.


  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 24-10 20:19
Hee nee je hebt gelijk hij compileert niet en de boosdoener is "test.array = p;". Foutmelding is weer incompatible types in assignment.

Maar ik kan dit dus beter met stringcopy doen ipv pointers?

[ Voor 0% gewijzigd door Gehakt op 15-11-2006 13:03 . Reden: wat overbodige letters verwijderd. ]


  • Cyphax
  • Registratie: November 2000
  • Laatst online: 17:59

Cyphax

Moderator LNX
Gehakt schreef op woensdag 15 november 2006 @ 12:58:
Heej neej je hebt gelijk hij compileert niet en de boosdoener is "test.array = p;". Foutmelding is weer incompatible types in assignment.

Maar ik kan dit dus beter met stringcopy doen ipv pointers?
strcpy, is wel netter idd.

Saved by the buoyancy of citrus


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Cyphax schreef op woensdag 15 november 2006 @ 12:59:
[...]

strcpy, is wel netter idd.
Doe dan wel gelijk strncpy om de lengte van je string in de gaten te houden.

Nu met Land Rover Series 3 en Defender 90


  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 24-10 20:19
Het is me gelukt met strncpy. Maar dacht dat het beter was om met pointers uit te voeren.

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 17:59

Cyphax

Moderator LNX
Gehakt schreef op woensdag 15 november 2006 @ 13:21:
Het is me gelukt met strncpy. Maar dacht dat het beter was om met pointers uit te voeren.
In sommige gevallen is dat wellicht ook beter maar bij een simpele toewijzing van een string is het netter om str(n)cpy te gebruiken. :)

Saved by the buoyancy of citrus


Verwijderd

Het kan ook wel met pointers maar dan dan met je van array in je struct een pointer maken en geen array. Dus
code:
1
2
3
typedef struct{
char *array;
} TEST;

Hangt ervan af wat je verder met die struct wil doen wat de beste oplossing is.

  • TaXaN
  • Registratie: April 2001
  • Laatst online: 08-09-2023
MTWZZ schreef op woensdag 15 november 2006 @ 13:04:
[...]

Doe dan wel gelijk strncpy om de lengte van je string in de gaten te houden.
Let op met strncpy() want deze functie termineert de string niet altijd. Hij kopieert vrolijk maximaal 'n' karakters zodat je in dat geval een niet afgesloten string over houdt.
Ofwel zet je zelf altijd een '\0' op de laatste plaats van de array ofwel gebruik je een functie als strlcpy(). Deze is niet standaard maar veel platformen hebben deze aan boord. Deze functie gaat ook de array niet padden met '\0' als er minder dan 'n' karakters gekopieerd worden zoals strncpy() doet (hetgeen in sommige situaties toch een kleine performance impact kan hebben).

A polar bear is a rectangular bear after a coordinate transformation.


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

strlcpy is inderdaad een veel handigere versie. Maar zoals je al zegt dat ding is niet overal standaard. Het blijft eigenlijk toch bij de programmeur liggen en hoeveel koffie die al op heeft :P

Nu met Land Rover Series 3 en Defender 90

Pagina: 1