Avatar billede frostholm Praktikant
15. november 2002 - 11:23 Der er 20 kommentarer og
2 løsninger

Copy af char[3000] til struct

Hejsa

Kan man nemt flytte indholdet af en tekststreng på 3000 karaktere over i en struct som er defineret således :

struct svars
{
    char kundeid    [22];
    char fejlnr    [02];
    char length    [04];
    char fejltekst    [100];
    char resten    [2872];
};   

Mvh
Michael F
Avatar billede chries Nybegynder
15. november 2002 - 11:27 #1
kommer an på opbygningen af din text streng. hvordan er den ?
hvis den er 1:1 kan du bruge memcpy, ellers er sscanf en løsning.
Avatar billede frostholm Praktikant
15. november 2002 - 11:33 #2
den er 1:1 men jeg får fejl de gange jeg har forsøgt med memcpy, vil du ikke komme med memcopy og struct/streng
Avatar billede chries Nybegynder
15. november 2002 - 11:55 #3
#include <string.h>
#include <iostream.h>
#include <stdio.h>

struct T
{
    char navn[10];
    char nummer[5];
};
   
int main(int argc, char* argv[])
{
    char test[15] = { 'A', 'R', 'N', 'E', 0, 0, 0, 0, 0, 0, '1', '0', 0, 0, 0 };

    T t;

    memcpy( &t, test, sizeof(T) );

    cout << t.navn << endl << t.nummer << endl;

    return 0;
}
Avatar billede arne_v Ekspert
15. november 2002 - 11:57 #4
struct svars x1;
char x2[3000];
memcpy(&x1,x2,3000);

bør virke !

Men måske var:

struct svars *x3 = (struct svars)x2;

smartere ?
Avatar billede frostholm Praktikant
15. november 2002 - 12:50 #5
hvad mener du med den sidste kommentar arne ?
Avatar billede arne_v Ekspert
15. november 2002 - 13:01 #6
Fordi du så kan bruge x3->kundeid og x3->fejlnr
fuldstændigt ligesom du ellers ville kunne
have brugt x1.kundeid og x1.fejlnr men:
  - du undgår at have 2 gange 3000 bytes i memory
    med samme data (sparer memory)
  - du undgår at kopiere 3000 bytes (sparer CPU tid)
Avatar billede frostholm Praktikant
15. november 2002 - 13:14 #7
Jeg ked jeg ikke forstår : så her et eksempel :

char tekst[30]
struct besked
{
  char fejlnr[10];
  char felktxt[20];
} fejlrec;

strcpy(tekst,"0123456789Der er sket en fejl");  // simulering af tekststreng

memcpy (&fejlrec,tekst,sizeof(fejlrec);

printf("Nr : %s ",fejrec.nr);

Dette viker ikke, Jeg er ikke med på hvad du helt mener med det sidste, men vil meget gerne lærem så hvis du vil komme med eks.
På forhånd tak
Avatar billede chries Nybegynder
15. november 2002 - 13:17 #8
du kan ikke gøre det sådan, der skal også være en nul terminering. dvs.
"streng\0DDDstreng2\0DDDDDDDDDDDDD"

hvor D er en dummy byte for at få offsets til at passe
Avatar billede chries Nybegynder
15. november 2002 - 13:18 #9
\0 svarer til en byte med værdien 0 og skal regnes med når der skal afsættes plads.
Avatar billede arne_v Ekspert
15. november 2002 - 13:20 #10
Der er ikke nogen nul i enden af fejlnr.

Hvis du prøver med:

strcpy(tekst,"012345678"); // kun 9 der skal være plads til nul byte
strcpy(tekst+10,"Der er sket en fejl"); // max. 19 tegn igen p.g.a. nul byte

memcpy (&fejlrec,tekst,sizeof(fejlrec));

printf("%s %s\n",fejlrec.nr,fejlrec.fejltxt);

Så bør du få korrekt svar ud.
Avatar billede frostholm Praktikant
15. november 2002 - 13:21 #11
Dvs man kan ikke tage en streng og "ligge ovenpå" en structur i c ?

Problemet er at den streng der skal føres over i structuren kommer fra et eksternt program. Er jeg nødsaget til at lave en funktion der splitter strengen up og flytter data)
Avatar billede arne_v Ekspert
15. november 2002 - 13:22 #12
Mit alternative forslag er:

struct besked *fejlrec_p;

strcpy(tekst,"012345678"); // kun 9 der skal være plads til nul byte
strcpy(tekst+10,"Der er sket en fejl"); // max. 19 tegn igen p.g.a. nul byte

fejlrec_p = (struct besked *)tekst;

printf("%s %s\n",fejlrec_p->nr,fejlrec_p->fejltxt);
Avatar billede arne_v Ekspert
15. november 2002 - 13:25 #13
Du kan godt ligge data oveni en struct.

Men det virker ikke godt nul byten på den
måde du gerne vil gøre det.

Jeg vil nok anbefale noget i retning af:

strcpy(fejlrec.nr, tekst);
strcpy(fejlrec.fejltxt, tekst+10);

i dit tilfælde.

Og så gøre de 2 felter så store, at der altid
er plads til en nul byte (som strcpy i modsætning til
memcpy sætter ind for dig).
Avatar billede frostholm Praktikant
15. november 2002 - 13:28 #14
Så jeg bliver nødsaget til på den ene eller anden måde at selv styre og sørge for der kommer 0 terminering i stregen eller i mine felter
Avatar billede chries Nybegynder
15. november 2002 - 13:32 #15
det externe program, bestemmer du selv streng indholdet (altså formatet) ?
Avatar billede frostholm Praktikant
15. november 2002 - 13:36 #16
det er et retursvar fra cpr, som hvist returneres som en buffer på 3000 bytes
Avatar billede chries Nybegynder
15. november 2002 - 13:39 #17
du har ikke et eksempel af det den returnerer ? altså alle 3000 tegn ?
Avatar billede frostholm Praktikant
15. november 2002 - 14:03 #18
nej desværre ikke
Avatar billede chries Nybegynder
15. november 2002 - 14:06 #19
Den har sikkert en eller anden for for token så du kan skille de forskellige strenge fra hinanden (f.eks endline). Er det tilfældet, kan du bruge strtok til at skille dem fra hinanden med.
Avatar billede frostholm Praktikant
15. november 2002 - 14:12 #20
det vil jeg undersøge.... vender tilbage i næste uge, tak for hjælpen pt
Avatar billede soepro Nybegynder
15. november 2002 - 14:25 #21
Jeg tror dine problemer skyldes at du overfører en struct i en streng. I C er alle strenge (jo) termineret med chr(0) - dvs. alle funktioner i C (og dermed faktisk også i Windows kernen) lavet sådan at de stopper behandlingen af strengen når de når til første chr(0). ('\x0') I dit eksempel betyder det omvendt at printf("Fejl nr. : %s", fejlrec.nr) *IKKE* stopper udskriften når de 10 tegn der egentlig er fejlteksten, er skrevet - men derimod først når den når til chr(0).

Du kan godt får det du har lavet til at fungere (jeg synes i den forbindelse også du skal bruge arne_v's løsning med blot at definere en pointer, og så sætte den til at pege på din string):

#include <stdio.h>

typedef struct
{
  char nr[10];
  char tekst[30];
}      defFejlRec;

int main(void)
{
  char fejlMessage[30] = "0123456789Dette er så teksten";
  defFejlRec *ptrFejlRec = (defFejlRec *)&fejlMessage;

  printf("Fejl nr: %.*s = \'%.*s\'", sizeof(pFejlRec->Nr), pFejlRec->Nr,
                                    sizeof(pFejlRec->Tekst), pFejlRec->Tekst);
  return 0;
}

Bemærk den lille krølle omkring format-specifier til printf ('%.*s') - punktum + stjernen betyder at der maksimalt udskrives det antal bytes fra strengen som angives i parameteren *FØR* selve strengen, altså sizeof(). Herved får du kun skrevet den del af strengen ud, som rent faktisk indeholder henholdvis nr og tekst. (Det er i øvrigt god, defensiv kodeteknik der medvirker til at undgå memory-overskrivninger.)
Avatar billede arne_v Ekspert
20. november 2002 - 15:49 #22
frostholm - har du fået løst problemet ?
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