Gå til innhold

Bone's Offisielle C++ hjelpetråd


Anbefalte innlegg

Videoannonse
Annonse

I C/C++ har array en fast lengde. Slik du initialiserer dem får String lengde 1 og myStr får lengde 18. String får lengde 1 fordi du ikke lagrer noen bokstaver og det blir lagt til en '\0' på slutten. myStr får lengde 18 fordi du lagrer 17 bokstaver og det blir lagt til en '\0' på slutten.

 

Tilordningen du forsøker å gjøre må gjøres som i eksempel 2. Grunne til at den feiler er at det ikke er plass til 18 tegn i et array som er beregnet på 1 tegn. Løsningen kan være å sette størrelsen på arraysene manuelt (char String[25]; ).

 

I tillegg er alt dette i prinsippet en liten pekersuppe. Så hvis du ikke har god kontroll på pekere vil store deler av string-bruken til tider virke ganske forvirrende og kryptisk.

 

Automatiske arrays som de du har laget er konstante pekere til hvert sitt minneområde. String (eller myStr) er egentlig en peker som kan skrives som som &String[0], altså adressen til det første elementet i arrayet. Når du skriver String = myStr, prøver du altså å tilordne adressen til myStr til adressen til String, men siden de automatiske arraysene har konstante adresser går det naturligvis ikke. For å kopiere innholdet i myStr til String må du derfor bruke enten strcpy() eller bruke en løkke som kopierer element for element. Du må uansett ha plass til alle elementene i String.

 

 

Det går altså ikke an å gjøre verken String[] = myStr[] eller String = myStr, selv om de har riktige størrelser.

 

 

Endret av endrebjo
Lenke til kommentar

Ok, takk.

 

Et lite problem til, er sikkert noe av det samme men ..... :

char Str[] = "";
cin >> Str;
cout << Str;

 

Skal kun ha programmet til å skrive ut det jeg skriver inn.

Får meldingen: Run-Time Check Failure #2 - Stack around the variable 'Str' was corrupted.

 

Hvordan skal jeg gå frem for å gjøre dette?

Endret av Senyor de la guerra
Lenke til kommentar

Da får jeg fyre på med hele koden. Som du kanskje ser fungerer det ikke så bra når lengden er ukjent ettersom jeg får printet ut en haug med meningsløse tegn på slutten av den krypterte meldingen. :hmm:

 

Ellers må teksten være uten mellomrom, da hele programmet lukker seg så fort " " dukker opp i koden. Hva skal jeg gjøre for å fikse dette?

 

// krypt.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <string>
using namespace std;

int main ()
{
char choose = 0;
int temp = 0;
char myStr[100] = "";
int counter = 0;
int key = 0;
int length = 0;

cout << "Encryption-key (integer): ";
cin >> key;

while ((choose != 'e')&&(choose != 'd'))
{	cout << endl << "Encrypt or decrypt message (e/d): ";
	cin >> choose;
}

if (choose == 'e')
{
	cout << "Message to encrypt: ";
	cin >> myStr;

	cout << endl;
	length = sizeof(myStr);

	while(counter < length-1)	
	{
		temp = myStr[counter];
		temp += key;
		myStr[counter] = temp;
		counter++;
	}

	cout << "Encrypted message: " << myStr;

}

if (choose == 'd')
{
	cout << "Message to decrypt: ";
	cin >> myStr;

	cout << endl;
	length = sizeof(myStr);

	while(counter < length-1)	
	{
		temp = myStr[counter];
		temp -= key;
		myStr[counter] = temp;
		counter++;
	}

	cout << "Decrypted message: " << myStr;
}

cin >> temp;


return 0;
} 

Endret av Senyor de la guerra
Lenke til kommentar

Look up memset i MSDN.

EDIT:

 

Eventuellt deklarer myStr slik: char myStr[100] = { 0 }. Dette vil ihvertfall med VC++ sette alle posisjonene til null.

 

Om en string ikke er nullterminert er det ingen måte for strlen å vite hvor stringen slutter og annet programdata begynner.

 

 

EDIT: Hva er det egentlig du prøver å gjøre her:

length = sizeof(myStr);

Endret av ze5400
Lenke til kommentar

Til praktisk bruk i C++ finnes det sjeldent noen god grunn til å bruke Cstring fremfor string. Alle problemene dine med ukjent lengde osv løses lett med string.

 

Og cin>> leser bare til den møter på en whitespace, altså enten mellomrom, newline og noen andre null-verdier. For å lese en hel linje kan du f.eks bruke cin.getline().

 

#include <string>
#include <iostream>

using namespace std;

int main()
{
   string text;
   cin.getline(text);
   for (int i = 0; i < text.size(); i++) {
       cout << size[i] << endl;
   }
}

 

 

Forøvrig er det en stor fordel å få taket på en god del grunnleggende teori (datatyper, pekere, arrays) før man begynner på praktiske problem. Å lære etter innfallsmetoden kan blir frustrerende i lengden, og du vet aldri om du har gått glipp av noe vesentlig. Det er i hvert fall veldig viktig å bli venn med dokumentasjonen. Referanselisten for standardbiblioteket på cplusplus.com er ikke så fryktelig stor at den blir uoversiktlig, og den hjelper deg veldig godt hvis du klarer å tippe deg til enkelte klassenavn og funksjonsnavn.

Endret av endrebjo
Lenke til kommentar

Look up memset i MSDN.

EDIT:

 

Eventuellt deklarer myStr slik: char myStr[100] = { 0 }. Dette vil ihvertfall med VC++ sette alle posisjonene til null.

 

Om en string ikke er nullterminert er det ingen måte for strlen å vite hvor stringen slutter og annet programdata begynner.

 

 

EDIT: Hva er det egentlig du prøver å gjøre her:

length = sizeof(myStr);

 

Dette hadde ingen effekt, programmet avsluttet så fort jeg brukte mellomrom.

 

sizeof(myStr) er for å kunne kryptere alle tegnene i stringen. Derfor leter jeg etter en metode som kan ta inn vilkårlige strenger. F.eks. alt fra 0 til 1000 tegn.

 

Forøvrig er det en stor fordel å få taket på en god del grunnleggende teori (datatyper, pekere, arrays) før man begynner på praktiske problem. Å lære etter innfallsmetoden kan blir frustrerende i lengden, og du vet aldri om du har gått glipp av noe vesentlig. Det er i hvert fall veldig viktig å bli venn med dokumentasjonen. Referanselisten for standardbiblioteket på cplusplus.com er ikke så fryktelig stor at den blir uoversiktlig, og den hjelper deg veldig godt hvis du klarer å tippe deg til enkelte klassenavn og funksjonsnavn.

Lærer mye bedre av å gå rett på problemløsning.

Lenke til kommentar

Dette hadde ingen effekt, programmet avsluttet så fort jeg brukte mellomrom.

Det var ikke dette problemet jeg tok tak i heller.

sizeof(myStr) er for å kunne kryptere alle tegnene i stringen. Derfor leter jeg etter en metode som kan ta inn vilkårlige strenger. F.eks. alt fra 0 til 1000 tegn.

 

Men sizeof sier bare hvor mange tegn det er plass til i arrayet, ikke mye av det som er brukt...

 

strlen sier hvor mange tegn en string inneholder.

Lenke til kommentar

Tja, si det.

 

Kan jo lese inn tekst slik isteden, f.eks:

while(fgets((char*)&myStr, 101, stdin)[strlen((char*)myStr)-1] != (char)0x0A);
 	myStr[strlen((char*)myStr)-1] = 0x00;

 

Da vil den lese intill den får enter, så nullterminerer den enter.

 

Om ikke annet er det en workaround.

 

 

 

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...