Zeiger auf Indizes eines Strings



  • ich möchte mir eine kleine "verschlüsselung schreiben". Allerdings habe ich gerade auch erst herausgefunden wie pointer und zeiger funktionieren. habe bisher nur mit dem copy-constructor gearbeitet.

    Ich möchte einen Klartext durch einen Schlüssel "chiffrieren". Allerdings gibt mir der compiler immer bei der operation(xor) zurück: [Error] no match for 'operator^' (operand types are 'std::string {aka std::basic_string<char>}' and 'std::string {aka std::basic_string<char>}')

    MIt dem Kopierkonstruktor funktioniert es.

    #include <iostream>
    #include <string>
    
    #include <windows.h>
    
    class crypt {
    public:
     std::string axor(std::string*,std::string*);
    };
    
    std::string crypt::axor(std::string *plain_text, std::string *key) {
     int lp_t = plain-text->length();
     int lk = key->length();   
     std::string cipher;
     int b = 0; 
      
      for(int ia = 0; ia > lp_t; ia++) { 
       if(b > lk) { b = 0; }
       cipher += plain_text[ia]^key[b]; 
      } 
      
     return cipher;
    }
        
     int main (void) {
    std::string sinput;
     
     while(1) {
      std::cin >> sinput;
      std::cout << crypt->axor(&sinput); << std::endl;
      if(sinput=="exit"||sinput=="quit") { break; }
      system("pause"); 
     }
     
     return 1;
    }
    

    PS: ich bin kein gelernter Programmierer, ich mache das als hobby. Kommentare wie: "lern erstmal programmieren" bitte unterlassen



  • @jaredgerald sagte in Zeiger auf Indizes eines Strings:

    ich mache das als hobby. Kommentare wie: "lern erstmal programmieren" bitte unterlassen

    Mit der Einstellung musst du dich nicht wundern, wenn nichts klappt.

    Benutze Referenzen und nicht Pointer als Parameter. Da du die Werte nicht ändern willst, dürfen sie const sein.



  • @jaredgerald sagte in Zeiger auf Indizes eines Strings:

    plain_text[ia]^key[b]

    plain_text und key sind jeweils ein Zeiger auf einen String.
    plain_text[N] und key[N] verwenden daher nicht den operator[] des Strings sondern den eingebauten operator[] für Arrays/Zeiger. Das ergebnis von plain_text[N] und key[N] ist daher jeweils eine Referenz auf einen std::string.

    Du musst (*plain_text)[ia] ^ (*key)[b] schreiben. Oder, besser: Verwende Referenzen als Parameter:

    std::string crypt::axor(std::string const& plain_text, std::string const& key) {
    

    PS: ich bin kein gelernter Programmierer, ich mache das als hobby. Kommentare wie: "lern erstmal programmieren" bitte unterlassen

    Ändert aber nichts daran dass du die Grundlagen lernen solltest. Ob du das beruflich machst oder hobbymässig ist völlig egal wenn es darum geht wie sehr (oder eben nicht) das Forum zum Erlernen der Grundlagen geeignet ist.



  • @jaredgerald sagte in Zeiger auf Indizes eines Strings:

    int lp_t = plain-text->length();

    Das passt so nicht. Achte auf jedes Zeichen. _ und - sind unterschiedliche Zeichen.

    for(int ia = 0; ia > lp_t; ia++) {

    Die Bedingung ist eine "solange"-Bedingung. ia ist 0, aber lp_t ist die Stringlänge, also größer als 0 (im Regelfall). Somit wird die Schleife gar nicht durchlaufen (es sei denn, dein plain_text ist ein Leerstring).



  • @wob sagte in Zeiger auf Indizes eines Strings:

    for(int ia = 0; ia > lp_t; ia++) {

    Die Bedingung ist eine "solange"-Bedingung. ia ist 0, aber lp_t ist die Stringlänge, also größer als 0 (im Regelfall). Somit wird die Schleife gar nicht durchlaufen (es sei denn, dein plain_text ist ein Leerstring).

    Ne, auch dann nicht.
    Müsste schon ein Anti-String sein.


Log in to reply