|
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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
| |
![](/images/tree/0.gif) Martin Dyring (24-11-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) Dennis Lerche (24-11-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) Kim Hansen (24-11-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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.
| |
![](/images/tree/0.gif) Kim Hansen (24-11-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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.
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) Dennis Lerche (24-11-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) Dennis Lerche (24-11-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) Kim Hansen (24-11-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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.
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) Dennis Lerche (24-11-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) Richard Flamsholt (25-11-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) Kim Hansen (25-11-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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.
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) Igor V. Rafienko (24-11-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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
| |
|
|