webForumDet fria alternativet

extra tecken i strängen?

C/C++ur C/C++

10 svar · 427 visningar · startad av pettsson

pettssonMedlem sedan jan. 20021 122 inlägg
#1

jag har ett program som tar emot en sträng, vänder den bakochfram, byter ut stora bokstäver mot små, och lagrar resultatet i en char. när jag sedan skriver ut denna char så kommer det, beroende på stränglängden att skriva ut extra tecken, typ @, ë, ï, 1(upphöjd) och liknande. om man skriver in 9+ tecken så fungerar allt som det ska... Nån som vart med om liknande förut? :q

ViktorMedlem sedan aug. 20021 752 inlägg
#2

Sista teknet i din sträng (char array?) måste vara '\0', då fungerar det.

/Viktor

pettssonMedlem sedan jan. 20021 122 inlägg
#3

hur lägger jag till det sist?

array[counter] = "\0";

Den här metoden fungerar ju inte... :(

BeatboxMedlem sedan okt. 20013 217 inlägg
#4

Använd sprintf() eller strcpy()

ViktorMedlem sedan aug. 20021 752 inlägg
#5

pettsson skrev:

hur lägger jag till det sist?

array[counter] = "\0";

Den här metoden fungerar ju inte... :(

array[strlen(array)]=[B]'[/B]\0[B]'[/B];

Du måste ha enkel fnuttar eftersom det är en char och inte en string.

/Viktor

FridolfMedlem sedan aug. 2001723 inlägg
#6

Om du deklarerar en variabel av typen char* utan att tilldela den till något kommer ett visst antal tecken att reserveras i minnet för den variabeln, har för mig att det är 8 tecken. Det åttonde tecknet blir då null, '\0'. Övriga bytes kan innehålla skräptecken. Om du sedan sätter in värden med array[1] = 'a' och liknande kommer de gamla tecknen att skrivas över. När du skriver ut en char* skrivs alla tecken fram till null ut. Om du har en sträng som är mindre än 8 tecken kommer skräptecken att skrivas ut i slutet.

Ännu värre... om du försöker skriva efter de 8 bytes som reserverats kommer du att skriva över andra (char*) variabler som deklarerats efter den första. Försöker du skriva ut den andra variabeln blir då resultatet konstigt.

Tips: använd antingen en array av fast storlek, tex char[100], eller använd någon bättre datatyp som std::string.

developerMedlem sedan aug. 2001458 inlägg
#7

Fridolf skrev:

Om du deklarerar en variabel av typen char* utan att tilldela den till något kommer ett visst antal tecken att reserveras i minnet för den variabeln...

Nej! Man vet bara att på stacken läggs en pekare (normalt ett 32-bitarsvärde) till en char array. Pekarvärdet är inte definierat.

EDIT: Ändrade syftningsfel.

Fridolf skrev:

...eller använd någon bättre datatyp som std::string.

God idé.

FridolfMedlem sedan aug. 2001723 inlägg
#8

Är du säker på det? Jag kan inte kolla det just nu men jag har för mig att när jag deklarerar sådana variabler får jag tillgång till 8 bytes minne. Dessa stycken läggs efter varandra i minnet. Man får ingen åtkomstöverträdelse om man försöker läsa där. Rätta mig om jag har fel. Det kanske beror på vilken kompilator man använder?

Marcus EMedlem sedan maj 20021 466 inlägg
#9

Ja, developer har helt rätt. Allt som allokeras är en pekare på fyra bytes av typen char.

Vill du allokera en sträng på 8 tecken kan du göra det på stacken:
char namn[8];
eller på heapen:
char *namn = new char[8];

Allokerar du på heapen, tar du bort den med delete[] namn.

PeWMedlem sedan juni 200010 432 inlägg
#10

Man får ingen åtkomstöverträdelse om man försöker läsa där. Rätta mig om jag har fel. Det kanske beror på vilken kompilator man använder?

Nej, det är inte kompilatorfel., fast visst vore det en bra feature. Det är helt enkelt en av farorna med C och C++.

developerMedlem sedan aug. 2001458 inlägg
#11

PeW skrev:

...fast visst vore det en bra feature.

Det finns i debug runtimen till senaste VC++ (VS.Net). Kör man exempelvis

char *invalid;
strcpy(invalid, "fel"); // Don't try this at home

kontrolleras oinitierade variabler (alltså även om man kör stand-alone utan debugger) och man får dialogen:

---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Error!

Program: c:\temp\invalid\debug\invalid.exe
Module: c:\temp\invalid\debug\invalid.exe
File: c:\temp\invalid\invalid.cpp
Line: 6

Run-Time Check Failure #3 - The variable 'invalid' is being used without being defined.

(Press Retry to debug the application)
---------------------------
Abort Retry Ignore
---------------------------

Även i VC6 initierar debug-runtimen variabler man inte själv initerat i sin kod till 0xCCCCCCCC för att minska risken att man använder felaktiga värden (eller "dangling pointers" som det kallas).

136 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)