[C++] string naar char

Pagina: 1
Acties:

  • mrfatmen
  • Registratie: Februari 2001
  • Laatst online: 26-08 22:06
zal wel een domme vraag zijn,
maar ik weet hem op het moment niet.

ik wil van een string, (bv "blaaterdieblaat").
wil ik per letter 1 letter terug in het alfabet

nu was mijn plan om een for loopje te maken zodat hij letter voor letter langsga.
en daar de ascii waarde van opslaan als ik daar dan 1 van af haal heb ik precies wat ik heb. (snap iedereen het nog).

nu lukt alles, alleen kan ik de ascii waarde niet voor me kaar krijgen.

dus mijn vraag ik eigelijk

hoe haal ik de ascii waarde uit een letter van een string?

Heeft uw auto pijn? Ga dan naar de onderdelenlijn
Het bedrijf waar ik met veel plezier werk - Mijn eigen vertrouwde domein


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 26-08 07:51

mulder

ik spuug op het trottoir

oogjes open, snaveltjes dicht


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
1) std::string omzetten in een cStyleString ( c_str() )
2) langslopen en voor elk element een -1 doen
3) Terugzetten in een string.

Dat c_str() had je zelf ook in een manual kunnen vinden :)
Dan ga ik er trouwens wel van uit dat je ANSI strings gebruikt (std::string dus), anders moet je even F1 drukken in je IDE om de method te vinden die hetzelfde doet als c_str()

Volgende keer graag even F1 drukken, of goed zoeken op het net :)
Veel succes ermee :)

edit:
Heropend op verzoek van MSalters :)

[ Voor 6% gewijzigd door Glimi op 30-12-2002 12:37 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:04

.oisyn

Moderator Devschuur®

Demotivational Speaker

Glimi schreef op 30 december 2002 @ 00:37:
1) std::string omzetten in een cStyleString ( c_str() )


nergens voor nodig, de operator [] is gewoon gedefinieerd voor std::string

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
hmm een -1 werkt natuurlijk niet he... want dan wordt a 0 enzo? een LUT is het enige dat zeker werkt en nog snel is.... als het een vorm van beveiliging is maakt het niet uit natuurlijk... maar dan kun je beter XOR-en..

[aan oisyn hieronder - ivm a word ' - lol had gisternacht echt geen goesting om dat op te zoeken ;]

[ Voor 20% gewijzigd door hobbit_be op 30-12-2002 21:25 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:04

.oisyn

Moderator Devschuur®

Demotivational Speaker

een a wordt overigens `, maar waarom zou dat een probleem zijn?
Een LUT is overigens wel een goede methode als je wilt dat bijvoorbeeld een é ook een d wordt, maar dan zul je met unicode of multibyte strings moeten werken (er zit ook wel een é in de europese extended ASCII tabel, maar die is dus niet standaard... dat is bij unicode wel zo)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • mrfatmen
  • Registratie: Februari 2001
  • Laatst online: 26-08 22:06
ik heb het nu voormekaar
voor de mensen die willen weten hoe

nou zo:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
 * Hier komt de functie ontcijfer, zet elke leeter 1 terug.
 *
 * @param   woord, is het word dat vertaalt wordt
 *
 * @return  het oncijverde woord
 */
string Ontcijfer(string woord)
{
    // declareer variable
    char myTijdelijk;

    // hier gaan we een for loop je alle letter doorlopen
    for (unsigned int i = 0; i < woord.size(); i++)
    {
        // hier halen we de character uit de string
        myTijdelijk = woord.at(i);

        // gaan we alle letter op "a" en "A" na 1 terug zetten
        // letters "a" en "A" worden omgezet in "z" en "Z"
        if ((myTijdelijk > 65) && (myTijdelijk < 91))   // Hoofdletters
        {
            myTijdelijk--;
        }
        else if ((myTijdelijk > 97) && (myTijdelijk < 123))   // kleine letters
        {
            myTijdelijk--;
        }
        else if ((myTijdelijk == 65) || (myTijdelijk == 97))  // "a" en "A"
        {
            myTijdelijk += 25;
        }

        // hier zetter we de letter terug
        woord.at(i) = myTijdelijk;
    }

    // sturen we dan het woord terug
    return woord;
}

Heeft uw auto pijn? Ga dan naar de onderdelenlijn
Het bedrijf waar ik met veel plezier werk - Mijn eigen vertrouwde domein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11:04

.oisyn

Moderator Devschuur®

Demotivational Speaker

kleine opmerking: ipv string::at () kun je ook string::operator[] gebruiken. Een at controleert namelijk of je index wel binnen het bereik ligt (0 <= index < size ()), en gooit een exception als dat niet zo is. Aangezien je er altijd binnen zit (je loopt immers maar van 0 tot size ()) is die check verder overbodig

Verder: zo te zien heb je het helemaal zelf opgelost... wat was nou de aanleiding van je topic? Volgende keer wat beter in de documentatie kijken voor je een topic opent dus...

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • mrfatmen
  • Registratie: Februari 2001
  • Laatst online: 26-08 22:06
.oisyn schreef op 30 December 2002 @ 15:12:
Verder: zo te zien heb je het helemaal zelf opgelost... wat was nou de aanleiding van je topic? Volgende keer wat beter in de documentatie kijken voor je een topic opent dus...
was gister avond al ruim 3 uur bezig en zag het echt totaal niet, al gezocht op inet en hier op got, maar kon het niet vinden.

en vanochtend onder de douche dacht ik ineens van zo kan ik het ook doen.
en toen werkte het dus :P

maar tenminste iedereen bedankt

Heeft uw auto pijn? Ga dan naar de onderdelenlijn
Het bedrijf waar ik met veel plezier werk - Mijn eigen vertrouwde domein


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
mag ik nou effe vragen WHY? ;) hoop echt dat het een school project is want echt moeilijk wordt dat passwoord niet voor te cracken ;)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
Wat ik dus wou posten dat je in C en C++ een char als getal kunt behandelen, maar dat had je dus al gezien.

Verder wou ik erop wijzen dat niet alle computers ASCII gebruiken (sterker nog, eigenlijk geen enkele - allemaal extensies, zoals ISO 8859-15 voor euro tekens, of Unicode). Dan kun je dus makkelijker c >= 'A' && c <= 'Z' schrijven. Dat is namelijk ongeveer wat je bedoelt; alleen is niet gegarandeerd dat 'B'=='A'+1 etc. (is wel erg gebruikelijk, maar sommige IBMs zijn dwars)

Hoe los je het dan op?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
char const lowercase[] = "abcdefghijklmnopqrstuvwxyza";
char const uppercase[] = "ABCDEFGHIJKMNOPQRSTUVWXIJZA";

char convert_char( char c )
{
  char const *which = std::find ( lowercase, lowercase+sizeof(lowercase), c);
  if ( which != lowercase+sizeof(lowercase) ) // found?
  {
    return *++which; // the next lowercase char
  }
  which = std::find ( uppercase, uppercase+sizeof(uppercase), c);
  if ( which != uppercase+sizeof(uppercase) ) // found?
  {
    return *++which; // the next uppercase char
  }
}

std::string convert_string( std::string s)
{
   std::transform( s.begin, s.end(), &convert_char );
   return s;
}

De tweede 'a' in de string is om een special-case voor 'z' te vermijden. std::find vindt 'm nooit.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1