String



  • Hallo alle zusammen ,
    kann mir jemand erklären wie ich ein String in ein char Array komplett rein kopieren kann ?

    Als Beispiel :

    char m_name[maxZahl];

    string name;

    Wie kopiere ich das komplette String in dem ganzen Array ?In C++


  • Mod

    std::copy bietet sich an. Aber ich würde sehr viel verwetten, dass du das gar nicht brauchst und du stattdessen eigentlich string::c_str möchtest.



  • for (int i = 0; i<name.size(); i++){
    
    char m_name[i] = "Hallo";
    string name(m_name);
    
    }
    

    Würde das auch so funktionieren?



  • Byson schrieb:

    for (int i = 0; i<name.size(); i++){
    
    char m_name[i] = "Hallo";
    string name(m_name);
    
    }
    

    Würde das auch so funktionieren?

    Nein.



  • Wie macht man das mit c_str?


  • Mod

    Byson schrieb:

    Wie macht man das mit c_str?

    Wie gesagt würde ich wetten, dass du gar nicht einen string in ein char-Array kopieren solltest, um dein Ziel zu erreichen. Aber um dir zu sagen, wie man das, was du vor hast, besser löst (höchstwahrscheinlich mit c_str), musst du uns natürlich erst einmal sagen, was du überhaupt erreichen möchtest. Es gibt ja sicherlich einen Grund, wieso du ein char-Array möchtest.



  • Ich bräuchte es nur für eine Übungsaufgabe , aber ich wusste nicht wie ich es machen soll .

    Daher hatte ich gefragt



  • Wie heißt denn die Übungsaufgabe?



  • Ich könnte sie auch Posten , aber bei Übungsaufgaben wird ja hier nicht gerne geholfen , daher wollte ich einfach an einem Beispiel verstehen wie es funktioniert und anwenden .

    Wie ihr wollt ?



  • Naja ohne zu wissen, was das Endergebnis sein soll, wirds schwer. Sonst bleibt die Lösung wohl c_str oder std::copy



  • SeppJ hats dir ja eigentlich schon gesagt, du nimmst std::copy dafür musst du wissen was Iteratoren sind und wie man Header einbindet.



  • Hm, ob std::copy wirklich das richtige ist? Vielleicht ist hier eher sowas wie strlcpy gesucht, wobei ich mal vermuten würde, dass man das von Hand implementieren soll. Aber ohne Aufgabe kann man nur raten.



  • Byson schrieb:

    for (int i = 0; i<name.size(); i++){
    
    char m_name[i] = "Hallo";
    string name(m_name);
    
    }
    

    Würde das auch so funktionieren?

    Ei ei ei -.-
    Du hast jetzt schon 2 Hinweise c_str oder std::copy, lies die C++ Referenz darüber, sind sogar Beispiele dabei!



  • #include <string>
    #include <vector>
    #include <iostream>
    
    auto main() -> int {
    std::string const myString{"Hallo"};
    std::vector<char> myVec{myString.begin(), myString.end()};
    
    for (auto character : myVec)
    std::cout << "Individual character: " << character << std::endl;
    
    }
    

    so in der Art



  • Ich poste doch lieber die AUFGABE:
    [code="cpp"#ifndef CProtocol_h
    #define CProtocol_h

    #define MAXPAYLOAD 30
    #include <stdio.h>
    #include<iostream>
    using namespace std;

    enum protocolId_t {UNDEFINED,TEMPERATURE,HUMIDITY,PRESSURE,ASCII,ALL};
    class CProtocol {

    private:
    protocolId_t m_id = UNDEFINED;
    char m_payload [MAXPAYLOAD] ={0};
    unsigned int m_nextFreePos = 0;
    unsigned int m_crc = 0;
    unsigned int const calculateCrc();

    public:
    CProtocol();
    CProtocol( protocolId_t id, string payload,unsigned int crc);
    void setProtocolId(protocolId_t id);
    protocolId_t getProtocolId()const;
    bool addPayload(char data);
    void setCrc(unsigned int crc);
    string getTypeAsString(protocolId_t id)const;
    friend ostream& operator << (ostream& out,const CProtocol& rop);

    };
    ostream& operator << (ostream& out,const CProtocol& rop);
    #endif /* CProtocol_h */
    [/code]

    Im Konstruktor wollte ich m_payload = payload setzen .
    Das klappt allerdings nicht ,da es einmal ein string ist und einmal char array?

    Vector haben wir leider nicht gelernt

    [code="cpp"CProtocol::CProtocol(){
    for (int i = 0; i< MAXPAYLOAD; i++){

    m_payload[i]= 0;
    }

    };
    CProtocol::CProtocol(protocolId_t id,string payload, unsigned int crc){
    for (int i = 0; i<payload.size(); i++){
    keine ahnung

    }

    m_crc = crc;

    m_id = id;
    if(m_nextFreePos>MAXPAYLOAD){

    m_nextFreePos = MAXPAYLOAD;
    }

    };[/code]

    Vielleicht versteht ihr mein Problem jetzt besser?



  • #include "CProtocol.h"
    #include <stdio.h>
    #include<iostream>
    #include<string>
    using namespace std;
    
    CProtocol::CProtocol(){
        for (int i = 0; i< MAXPAYLOAD; i++){
    
            m_payload[i]= 0;
        }
    
    };
    CProtocol::CProtocol(protocolId_t id,string payload, unsigned int crc){
        for (int i = 0; i<payload.size(); i++){
            Keine Ahnung
    
        }
    
        m_crc = crc;
    
        m_id = id;
        if(m_nextFreePos>MAXPAYLOAD){
    
            m_nextFreePos = MAXPAYLOAD;
        }
    
    };
    

    header:

    #ifndef CProtocol_h
    #define CProtocol_h
    
    #define MAXPAYLOAD 30
    #include <stdio.h>
    #include<iostream>
    using namespace std;
    
    enum protocolId_t {UNDEFINED,TEMPERATURE,HUMIDITY,PRESSURE,ASCII,ALL};
    class CProtocol {
    
    private:
        protocolId_t m_id = UNDEFINED;
        char  m_payload [MAXPAYLOAD]  ={0};
        unsigned int m_nextFreePos = 0;
        unsigned int m_crc = 0;
        unsigned int  const calculateCrc();
    
    public:
        CProtocol();
        CProtocol( protocolId_t id, string payload,unsigned int crc);
        void setProtocolId(protocolId_t id);
        protocolId_t getProtocolId()const;
        bool addPayload(char data);
        void setCrc(unsigned int crc);
        string  getTypeAsString(protocolId_t id)const;
        friend ostream& operator << (ostream& out,const CProtocol& rop);
    
    };
    ostream& operator << (ostream& out,const CProtocol& rop);
    #endif /* CProtocol_h */
    

    Der code wurde oben nicht richtig dargestellt 🙂



  • Naja, so richtig Sinn macht das alles nicht. Aber gut, die Übungsaufgabe ist halt so gestellt.

    m_payload ist ein Puffer, der die Telegrammdaten aufnehmen soll, die im Konstruktor als std::string übergeben werden. Deine Aufgabe ist es jetzt, die Zeichen aus payload in den Puffer zu übertragen. Im Konstruktor ist das einfach, weil der Puffer noch leer ist und von Beginn an gefüllt werden kann. Du musst also diese Schritte erledigen:

    1. Prüfen, ob ausreichend Platz im Puffer ist. Die Länge von payload darf nicht größer sein als MAXPAYLOAD damit das der Fall ist.

    2. Die Einfügeposition in den Puffer merken, falls später zB über addPayload weitere Daten angehängt werden müssen.

    3. Die CRC-Prüfsumme für m_Payload berechnen

    Die Aussage, dass hier bei Hausaufgaben nicht gerne geholfen wird, ist pauschal falsch. Es gibt zwar häufig patzige Antworten in Hausaufgaben-Threads, aber nur deswegen, weil der Threadersteller sich keine Mühe gibt, keine Eigeninitiative zeigt und glaubt, er könne hier nach fertigen Lösungen fragen.



  • [code="cpp"CProtocol::CProtocol(protocolId_t id,string payload, unsigned int crc){
    for (int i = 0; i<payload.size(); i++){
    if(m_nextFreePos< MAXPAYLOAD&& payload.size()== MAXPAYLOAD){

    }

    }
    [/code]

    Ein bisschen was habe ich. ABer keine Ahnung wie ich weiter vorgehen soll?



  • Byson schrieb:

    CProtocol::CProtocol(protocolId_t id,string payload, unsigned int crc){
        for (int i = 0; i<payload.size(); i++){
            if(m_nextFreePos< MAXPAYLOAD&& payload.size()== MAXPAYLOAD){
                
                
            }
            
            
            
        }
    

    Ein bisschen was habe ich. ABer keine Ahnung wie ich weiter vorgehen soll?

    Genau genommen hast du leider nocht gar nichts, denn das da ist so unendlicher großer Murks, dass ich fast schon weinen möchte. Was genau soll das denn sein, bitte um Erklärung!



  • Die Länge von payload darf nicht größer sein als MAXPAYLOAD damit das der Fall ist

    Dachte das wäre die Antwort dafür 😃


Log in to reply