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
extra tecken i strängen?
10 svar · 427 visningar · startad av pettsson
Använd sprintf() eller strcpy()
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
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.
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é.
Ä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?
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.
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++.
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).