/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Kan ikke sætte en værdi i en
Fra : Dennis Lerche


Dato : 24-11-02 13:13

Hej

Hvorfor kan jeg ikke få lov til at sætte en værdi i en string
Det går galt hvor jeg prøver at sige pointer[0] = endpoint[0].
Jeg har prøvet at caste og calloc hukommelse til pointerne men lige lidt
hjælper det

void removeChar(char *Sw, int a){
char *pointer, *endpoint;


pointer = strchr(Sw,a); //find the slave among all the slaves
endpoint = strchr(Sw,'\0'); //find the last point in the string
endpoint--;
pointer[0] = endpoint[0]; //override the slaveid with the last id in
the string
*(endpoint-1) = '\0'; //decrease the string

}


Dennis


 
 
Kim Hansen (24-11-2002)
Kommentar
Fra : Kim Hansen


Dato : 24-11-02 13:29

Dennis Lerche <dler00@control.auc.dk> writes:

> Hej
>
> Hvorfor kan jeg ikke få lov til at sætte en værdi i en string
> Det går galt hvor jeg prøver at sige pointer[0] = endpoint[0].
> Jeg har prøvet at caste og calloc hukommelse til pointerne men lige lidt
> hjælper det
>
> void removeChar(char *Sw, int a){
> char *pointer, *endpoint;
>
>
> pointer = strchr(Sw,a); //find the slave among all the slaves
> endpoint = strchr(Sw,'\0'); //find the last point in the string
> endpoint--;
> pointer[0] = endpoint[0]; //override the slaveid with the last id in
> the string
> *(endpoint-1) = '\0'; //decrease the string

Du peger på endpoint, så du skal ikke trække 1 fra.

>
> }

--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-'`' -. ;-;;,_ | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Phone: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Dennis Lerche (24-11-2002)
Kommentar
Fra : Dennis Lerche


Dato : 24-11-02 13:36

>
> > *(endpoint-1) = '\0'; //decrease the string
>
> Du peger på endpoint, så du skal ikke trække 1 fra.
>

Ja sådan går det jo når man sidder og ændre hele tiden
Men på trods af det kommer der stadig en segmatation fault i:
pointer[0] = endpoint[0]; //override the slaveid with the last ...

Det er der det hele går galt, så den er ikke kommet ned til den fejl du
nævnte.

Dennis


Martin Dyring (24-11-2002)
Kommentar
Fra : Martin Dyring


Dato : 24-11-02 13:51

"Dennis Lerche" <dler00@control.auc.dk> wrote in message
news:3DE0C7A8.3701341F@control.auc.dk...
> Det er der det hele går galt, så den er ikke kommet ned til den fejl du
> nævnte.

Du checker ikke om endpoint eller pointer er NULL (som strchr jo kan
returnere). Måske skyldes din segmentation-fault det?

--
Mvh,
Martin Dyring




Dennis Lerche (24-11-2002)
Kommentar
Fra : Dennis Lerche


Dato : 24-11-02 13:53

Martin Dyring wrote:

> "Dennis Lerche" <dler00@control.auc.dk> wrote in message
> news:3DE0C7A8.3701341F@control.auc.dk...
> > Det er der det hele går galt, så den er ikke kommet ned til den fejl du
> > nævnte.
>
> Du checker ikke om endpoint eller pointer er NULL (som strchr jo kan
> returnere). Måske skyldes din segmentation-fault det?

Nej der ligger en værdi i, det kan også ses når jeg debugger.
Det er bare underligt at jeg kan få det til at virker hvis den string jeg
sender ned er initialiseret til 2 chars sådan her:
char st[2] = {'3','5'};

Men så snart der bliver fyldt flere på går det galt.

Dennis


Kim Hansen (24-11-2002)
Kommentar
Fra : Kim Hansen


Dato : 24-11-02 13:58

Dennis Lerche <dler00@control.auc.dk> writes:

> Martin Dyring wrote:
>
> > "Dennis Lerche" <dler00@control.auc.dk> wrote in message
> > news:3DE0C7A8.3701341F@control.auc.dk...
> > > Det er der det hele går galt, så den er ikke kommet ned til den fejl du
> > > nævnte.
> >
> > Du checker ikke om endpoint eller pointer er NULL (som strchr jo kan
> > returnere). Måske skyldes din segmentation-fault det?
>
> Nej der ligger en værdi i, det kan også ses når jeg debugger.
> Det er bare underligt at jeg kan få det til at virker hvis den string jeg
> sender ned er initialiseret til 2 chars sådan her:
> char st[2] = {'3','5'};

Men så er du ikke sikker på at der er et 0 for enden af char*, det er
din funktion afhængig af.


--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-'`' -. ;-;;,_ | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Phone: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Kim Hansen (24-11-2002)
Kommentar
Fra : Kim Hansen


Dato : 24-11-02 13:57

Dennis Lerche <dler00@control.auc.dk> writes:

> >
> > > *(endpoint-1) = '\0'; //decrease the string
> >
> > Du peger på endpoint, så du skal ikke trække 1 fra.
> >
>
> Ja sådan går det jo når man sidder og ændre hele tiden
> Men på trods af det kommer der stadig en segmatation fault i:
> pointer[0] = endpoint[0]; //override the slaveid with the last ...

Det ville jeg forresten skrive *pointer = *endpoint;, men det er bare
smag og behag.

Jeg lavede et lille testprogram, og der virkede din funktion fint, er
du sikker på at de parametre du giver til din funktion er rigtige?

Hvilken compiler bruger du, bruger du en debugger?

--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-'`' -. ;-;;,_ | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Phone: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Dennis Lerche (24-11-2002)
Kommentar
Fra : Dennis Lerche


Dato : 24-11-02 14:03

>
> Det ville jeg forresten skrive *pointer = *endpoint;, men det er bare
> smag og behag.
>
> Jeg lavede et lille testprogram, og der virkede din funktion fint, er
> du sikker på at de parametre du giver til din funktion er rigtige?
>
> Hvilken compiler bruger du, bruger du en debugger?

Jeg startede med at skrive *pointer = *endpoint;
Men kunne ikke få det til at virke
Men nu virker det, det var netop et spørgsmål om at hive det rigtige ned
*lol*

Tak for hjælpen begge to

Dennis


Dennis Lerche (24-11-2002)
Kommentar
Fra : Dennis Lerche


Dato : 24-11-02 14:29

>
> Det ville jeg forresten skrive *pointer = *endpoint;, men det er bare
> smag og behag.
>
> Jeg lavede et lille testprogram, og der virkede din funktion fint, er
> du sikker på at de parametre du giver til din funktion er rigtige?
>
> Hvilken compiler bruger du, bruger du en debugger?
>

Hvis nu strengen er deklareret sådan:
char *st="123456";

Hvordan skal jeg så udtrykke linjen for at få det til at virke ?

Det virker jo når man gør sådan:
char st[8] = {'3','5','2','4','7','1','8'};


Dennis


Kim Hansen (24-11-2002)
Kommentar
Fra : Kim Hansen


Dato : 24-11-02 15:56

Dennis Lerche <dler00@control.auc.dk> writes:

> >
> > Det ville jeg forresten skrive *pointer = *endpoint;, men det er bare
> > smag og behag.
> >
> > Jeg lavede et lille testprogram, og der virkede din funktion fint, er
> > du sikker på at de parametre du giver til din funktion er rigtige?
> >
> > Hvilken compiler bruger du, bruger du en debugger?
> >
>
> Hvis nu strengen er deklareret sådan:
> char *st="123456";

Så virker det fordi der automatisk sættes et 0 efter strengen. Du skal
dog være opmærksom på om du kan skrive til den hukommelse som
variablen lægges i.

> Hvordan skal jeg så udtrykke linjen for at få det til at virke ?
>
> Det virker jo når man gør sådan:
> char st[8] = {'3','5','2','4','7','1','8'};

Det er et tilfælde at der er et nul efter st, men hvis du selv sætter
det ind er du sikker på at det altid vil virke.

char st[] = {'3','5','2','4','7','1','8',0};
^^ Du behøver ikke at skrive et tal her, det kan den selv
regne ud.

--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-'`' -. ;-;;,_ | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Phone: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Dennis Lerche (24-11-2002)
Kommentar
Fra : Dennis Lerche


Dato : 24-11-02 16:14

Kim Hansen wrote:

> > Hvis nu strengen er deklareret sådan:
> > char *st="123456";
>
> Så virker det fordi der automatisk sættes et 0 efter strengen. Du skal
> dog være opmærksom på om du kan skrive til den hukommelse som
> variablen lægges i.

Jeg kan ikke få det til at virke med ovenstående
Jeg får en segmentation fault hver gang den kommer til linjen:

Jeg kan bare ikke se hvordan jeg skal udtrykke den linje når det er en
stringpointer der bliver
hevet ned i funktionen;

*pointer=*endpoint;

Dennis


Richard Flamsholt (25-11-2002)
Kommentar
Fra : Richard Flamsholt


Dato : 25-11-02 21:53

Kim Hansen <k-tahf.qvxh@oek.dk> skrev:
>> Det virker jo når man gør sådan:
>> char st[8] = {'3','5','2','4','7','1','8'};
>
>Det er et tilfælde at der er et nul efter st

Nej, det er skam garanteret, omend det ikke er god skik.

Hvis et array med en angivet størrelse (st[8], ikke st[]) initialiseres
i definitionen vil de dele, der ikke eksplicit tildeles en værdi, blive
initialiseret til 0.

(Den samme mekanisme gør sig i øvrigt gældende når en initialisering af
en struct angiver færre initialiseringsværdier end structen har members;
da initialiseres resten også til 0. Fx struct {int x,y;} a = {7}; sætter
a.x=7 og a.y=0)

At det er korrekt betyder dog ikke, at det er god skik - for det er det
absolut ikke. Dels er der en uhensigtsmæssig binding mellem tallet "8"
og antallet af initializers og dels forledes folk (fx Kim) til at tro,
at st[7] er garbage, fordi de ikke kender "0-initialiserings"-reglen.

--
Richard Flamsholt
richard@flamsholt.dk - www.richard.flamsholt.dk

Kim Hansen (25-11-2002)
Kommentar
Fra : Kim Hansen


Dato : 25-11-02 23:40

Richard Flamsholt <richard@flamsholt.dk> writes:

> Kim Hansen <k-tahf.qvxh@oek.dk> skrev:
> >> Det virker jo når man gør sådan:
> >> char st[8] = {'3','5','2','4','7','1','8'};
> >
> >Det er et tilfælde at der er et nul efter st
>
> Nej, det er skam garanteret, omend det ikke er god skik.

Ok, det var obfuskeret (findes det ord på dansk?). Jeg havde ikke talt
efter, og troede der var 8 elementer i tildelingen.

--
Kim Hansen | |\ _,,,---,,_ | Det er ikke
Dalslandsgade 8, A708 | /,`.-'`' -. ;-;;,_ | Jeopardy.
2300 København S | |,4- ) )-,_. ,\ ( `'-' | Svar _efter_
Phone: 32 88 60 86 | '---''(_/--' `-'\_) | spørgsmålet.

Igor V. Rafienko (24-11-2002)
Kommentar
Fra : Igor V. Rafienko


Dato : 24-11-02 18:15

[ Dennis Lerche ]

[ ... ]

> Hvis nu strengen er deklareret sådan:
> char *st="123456";
>
> Hvordan skal jeg så udtrykke linjen for at få det til at virke ?
>
> Det virker jo når man gør sådan:
> char st[8] = {'3','5','2','4','7','1','8'};


Jeg gjetter på at følgende kan potentielt være et problem.
Definisjonene:


char *ptr1 = "Quick brown fox jumps over the lazy dog";

og

char ptr2[] = "Quick brown fox jumps over the lazy dog";


.... er vesentlig forskjellige. I det første tilfellet er ptr1 en peker
til en _konstant_ tekst[*]. Det å modifisere en slik tekst kan ha
uheldige konsekvenser (som fx. SIGSEGV/GPF).

Derimot ptr2 er en array som inneholder en _kopi_ av tekstkonstanten.
Kopien kan, naturligvis, modifiseres.

Det er særdeles uheldig at man får lov til å si:

char *ptr = "foo";

.... da man enten menter "char ptr[]", eller så mener man:

const char *ptr = "foo";





ivr
[*] 'tekst' er litt upresist. Egentlig heter det "array of N const char".
--
<peder> igorr: tcl ja... det er fra de dypeste avgrunnene i helvete det...
<peder> php er bare fra foajeen
            -- pederst på irc

Søg
Reklame
Statistik
Spørgsmål : 177491
Tips : 31966
Nyheder : 719565
Indlæg : 6408458
Brugere : 218886

Månedens bedste
Årets bedste
Sidste års bedste