Avatar billede simonsenpq Nybegynder
23. oktober 2002 - 14:42 Der er 11 kommentarer og
2 løsninger

Gemme struct variabel i char array

En mindre fortsættelse af http://www.eksperten.dk/spm/273451

Hvis jeg nu fx har kunde[2].navn og gerne vil have lagt den ind i et char array. Hvordan gør jeg det?
Burde det ikke bare være noget i retning af

char navn[20] = kunde[2].navn;  ??
Avatar billede jpk Nybegynder
23. oktober 2002 - 14:46 #1
Nej, du skal bruge strcpy
Avatar billede arne_v Ekspert
23. oktober 2002 - 14:46 #2
strcpy(navn,kunde[2].navn);
Avatar billede soepro Nybegynder
23. oktober 2002 - 14:48 #3
Nej ikke helt, du skal bruge enten strcpy() eller strncpy() metoden fra <string.h>:

char navn[20];
strcpy(navn, kunde[2].navn);
strncpy(navn, kunde[2].navn, sizeof(navn)-1);

Sidstnævnte er at foretrække, fordi den forhindrer at der kopieres mere fra kunde[2].navn end der er plads til i navn - karater o ('\x0') inklusive.
Avatar billede simonsenpq Nybegynder
23. oktober 2002 - 15:51 #4
Det ser ud til at virke, hvis jeg udskriver navn.

Men... Hvis vi nu siger, at strengen 'Hans' nu er blevet kopieret over i navn, hvorfor virker følgende så ikke?

strcmp(navn, "Hans") == 0
Avatar billede smokes Nybegynder
23. oktober 2002 - 16:18 #5
Simonsenpg:
Alle arrays (dermed også text arrays, eller strenge) bliver referet til ved hjælp af en pointer.
ved at skrive:
char navn[20] = kunde[2].navn;

gemmer du kunde[2].navn's pointer i navn[].. det vil sige at navn[] ikke indeholder tekstrengen men peger på kunde[2].navn.. derfor kan du ikke sammenligne dem med strcmp().. soepro's løsning er korrekt :-).
Jeg ville dog nok oprette navn[20] dynamisk så du er sikker på at der altid er plads nok.. noget ala:

int length = strlen(kunde[2].navn);
char *navn = (char *) malloc(length);
memset(navn,0,length);
strcpy(navn, kunde[2].navn);

og så ville
strcmp(navn, kunde[2].navn) == true :-)


soepro:
strncpy(navn, kunde[2].navn, sizeof(navn)-1);

såvidt jeg kan se underlader du at kopiere \0 med.. hvilket vil bevirke at en rutine som printf() vil læse videre når strengen er slut.. strenge er nul termineret i C.. men det vil da virker hvis kunde[2].navn er mindre end 20 chars og navn er clearet til nul inden brug..
Avatar billede simonsenpq Nybegynder
23. oktober 2002 - 16:43 #6
> det vil sige at navn[] ikke indeholder tekstrengen
> men peger på kunde[2].navn.. derfor kan du ikke
> sammenligne dem med strcmp()

Hvad gør jeg så, hvis jeg ønsker at sammenligne?
Avatar billede arne_v Ekspert
23. oktober 2002 - 18:22 #7
Smokes:

int length = strlen(kunde[2].navn);
char *navn = (char *) malloc(length);
memset(navn,0,length);
strcpy(navn, kunde[2].navn);

Jeg tror der er faldet et +1 ud af dit indlæg.

:-)
Avatar billede smokes Nybegynder
23. oktober 2002 - 19:42 #8
arne v: så skidt da *g* malloc(length+1).. ya happy now? *g*

simonsenpg: thats right.. well hvis du gør som jeg har foreslået (med arnes +1 *g*) skulle det virke.. men det kommer selvfølgelig an på sammenhængen du bruger det i.. går ikke udfra at du (som skrevet her) vil kopiere en streng og sammenligne den i samme funktion.. så er du jo ligesom sikker på at begge strenge indeholder det samme.. og hvorfor så sammenligne *s*.. har lige luret den thread som denne her var en forsættelse af.. kunde navn var erklæret sådan her:

char Navn[256];

well.. så forstår jeg ikke dit oprindelige spørgsmål.. for Kunde[2].Navn ER et char array :-)..

Jeg gætter på at det du vil er at finde en kunde udfra et navn som er indtastet et andet sted i programmet?

fint nok.. du har dit Kunde[] array initialiseret og det hele.. du har læst en streng ind i Navn[20] (som du nok bør gøre ligeså lang som kunde.navn[] eller allokere dynamisk).. hvis begge strenge er nul terminerede (slutter med et 0) kan du bare bruge strcmp

// gennemløber alle kunder for at finde det indtastede navn
int index;
for( index = 0; index < ANTAL_KUNDER; index++ )
{
    if( strcmp(Navn, Kunde[index].Navn) )
    {
      // yeps kunde med Navn er fundet i array på plads index,
      //  gør eller andet ved ham her :-)
    }
}
Avatar billede simonsenpq Nybegynder
24. oktober 2002 - 00:16 #9
Det virker ikke! Heller ikke selv om jeg skriver
if (strcmp(Navn, Kunde[index].Navn) == 0)

Nogen forskel hvis jeg skriver strengen direkte i stedet for 'Navn'?
Fx strcmp("Hans", Kunde[index].Navn) == 0
Avatar billede segmose Nybegynder
25. oktober 2002 - 09:02 #10
int length = strlen(Kunde[2].navn);
char *navn = (char *) malloc(length+1);
memset(navn,0,length);  //overflødigt i dette exemple da vi kun alloc'er precis plads.
strcpy(navn, Kunde[2].navn);

if (strcmp(navn, Kunde[2].Navn) == 0)  printf("%s == %s\n", navn, Kunde[2].Navn);
else
  printf("%s != %s\n", navn, Kunde[2].Navn);

Hvad giver det som output hvis det indsættes efter din sortering?
Avatar billede simonsenpq Nybegynder
25. oktober 2002 - 09:07 #11
Tak for hjælpen til jer alle! Jeg fik det bare ikke til at virke. Nu har jeg givet op og fundet en anden løsning.
Avatar billede soepro Nybegynder
29. oktober 2002 - 09:53 #12
smokes >> Ifølge min on-line help, sætter strncpy() funktionen altid selv '\x0' til sidst. size angiver det maskimale antal betydende tegn der må kopieres - derfor sizeof()-1.
Avatar billede arne_v Ekspert
29. oktober 2002 - 10:22 #13
Så er din dokumentation forkert !

Den skriver altid kun maksimale antal bytes.

Hvis der er det maksimale antal tegn bliver der ikke
sat en nul byte ind efter.

Men hvis der er færre bytes, så bliver der sat en nul byte ind.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester