Senyor de la guerra Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 (endret) Hvordan går man frem hvis jeg skal dele et ord opp i bokstaver? Tenker noe slikt: >>A = 'Hei' A = Hei >>for i = 1:length(A) > A(i) > end ans = H ans = e ans = i >> Dette er MATLAB-kode, hva blir tilsvarende i C++, må man tenke på en helt annen måte? Endret 11. mars 2010 av Senyor de la guerra Lenke til kommentar
ze5400 Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 En string er jo bare en char-array, så det er da ikke verre enn å iterere gjennom lengden av strigen? Lenke til kommentar
endrebjo Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 Forøvrig er det greit å skille mellom en Cstring og en string (fra string-biblioteket i C++). Førstnevnte er bare et char-array, mens sistnevnte er et objekt som har egenskapene til en Cstring pluss mye mye mer. Og Cstring har flere artige treff på Google. Lenke til kommentar
Senyor de la guerra Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 char String[] = ""; char myStr[] = "Dette er en tekst"; String[] = myStr[]; error C2059: syntax error : ']' char String[] = ""; char myStr[] = "Dette er en tekst"; String = myStr; error C2440: '=' : cannot convert from 'char [18]' to 'char [1]' Herk, hva nå? Lenke til kommentar
endrebjo Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 (endret) 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 11. mars 2010 av endrebjo Lenke til kommentar
Senyor de la guerra Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 (endret) 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 11. mars 2010 av Senyor de la guerra Lenke til kommentar
endrebjo Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 Igjen har du initialisert et array med lengde 1. Hvis du prøver å laste inn en tekst som er lenger enn det vil du få masse tull. Forsøk med char Str[50], eller noe annet som passer inputen din. Lenke til kommentar
Senyor de la guerra Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 (endret) 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. 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 11. mars 2010 av Senyor de la guerra Lenke til kommentar
GeirGrusom Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 Kall en memset på mystr for å initialisere hele dataområdet til null. Lenke til kommentar
Senyor de la guerra Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 Hehe, har du lyst til å forklare litt nærmere? Lenke til kommentar
ze5400 Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 (endret) 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 11. mars 2010 av ze5400 Lenke til kommentar
endrebjo Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 (endret) 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 11. mars 2010 av endrebjo Lenke til kommentar
Senyor de la guerra Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 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
ze5400 Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 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
Senyor de la guerra Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 strlen sier hvor mange tegn en string inneholder. Genialt Men, er det ingen som kan hjelpe meg med å få med mellomrom? Lenke til kommentar
ze5400 Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 Altså - hva mener du? Om du bare inn mellomrom - er det da problemet oppstår, eller skjer det når mellomrommene er midt i en setning? Mellomrom skal oppfattes som ASCII-koden 0x20, så det er litt rart om det blir problemer midt i setningen. Lenke til kommentar
Senyor de la guerra Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 Fungerer ikke: "Dette er en test" Fungerer: "Detteerentest" Lenke til kommentar
ze5400 Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 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
endrebjo Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 (endret) cin.getline(myStr) Som nevnt tidligere. Endret 11. mars 2010 av endrebjo Lenke til kommentar
Senyor de la guerra Skrevet 11. mars 2010 Del Skrevet 11. mars 2010 cin.getline(myStr) Som nevnt tidligere. Error 1 error C2661: 'std::basic_istream<_Elem,_Traits>::getline' : no overloaded function takes 1 arguments Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå