【问题标题】:A beginner string, constructors初学者字符串,构造函数
【发布时间】:2015-05-28 05:58:06
【问题描述】:

我正在为我的课程编写代码,但我遇到了一个问题。我以前从未在 C++ 中处理过字符串,而且我不知道如何将一个字符串分成另外两个。程序也可以编译,但输出错误,我怀疑构造函数。有人可以看看并给我一个回答,我应该改变什么才能使代码正常工作吗?我将不胜感激:)

代码如下: main(老师给的)

   int main()
{
    oop::Data a;
    oop::Data b;

  {
        MACRO1;//co tu ma się dziać?
    Data b;     
  }

    const oop::Data Data_element = "Test-first"; // tworzony jest obiekt const o nazwie Data_element klasy Data, do którego wpisywany jest teks

    const oop::Data c(Data_element, "Test-second"); // wywołanie konstruktora

    a.full_data("Pierwszy Drugi");
    b.first() = b.second("Tekst testowy"); //co tu ma się dziać?

    std::cout
        << "a = " << a << std::endl;
    std::cout           
        << "b = " << b.full_data() << std::endl;
    std::cout
        << "c = " << c.first() << ", " << c.second() << std::endl;


    const oop::Data d = a.to_upper(); //zamienia na WIELKIE litery
    oop::Data e = d.to_lower(); //zamienia na mnałe litery

    std::cout
        << "d = " << d << std::endl;
    std::cout
        << "e = " << e << std::endl;

}

/* Output:
a = ["Pierwszy", "Drugi"]
b = ["Tekst testowy", "Tekst testowy"]
c = Test-first, Test-second
d = ["PIERWSZY", "DRUGI"]
e = ["pierwszy", "drugi"]
*/

.h 文件:

#define MACRO1 using namespace oop;
//Makro !

#include <string>
#include <iostream>


namespace oop{

    class Data
    {
    public:
        Data(const char*);//Konstruktor ma przyjac const char* a nie string bo " text " to const char*
        Data(const Data&,const char*);
        Data();
        Data(const Data&);//dla linijki 35
        ~Data();


        void first_data(char* data);
        std::string first() const;
        const char* second()const;//to sie przyda
        std::string second(std::string data) const;
        //const char* full_data(const std::string data);
        void full_data(const std::string data);
        const char* full_data();
        Data to_upper(void) const;//const dodajesz tutaj zawsze jak nie zmieniasz obiektu zeby metoda dzialala na const obiekcie
        Data to_lower(void) const;

        friend std::ostream & operator <<(std::ostream & wypisz, const Data& data);


    private:
        const char* _text1;
        const char* _text2;

    };

    inline std::ostream & operator <<(std::ostream & wypisz, const Data& data)
    {return (wypisz<<"[\"" << data._text1 << " \", \" " << data._text2 << "\" ]");}

}
#endif

.cpp 中的函数

    #include <iostream>
#include "lab07.h"
#include <string>

//konstruktor*******************************************************************************************************
    oop::Data::Data(const char* c)
    {_text1=c;}

    oop::Data::Data(const Data& object,  const char* c)
    {
        _text1 = object._text1;
        _text2 = c;
    }

    oop::Data::Data(){} //tu chyba nic nie jest potrzebne
    oop::Data::Data(const Data& object)
    {
        _text1 = object._text1;
        _text2 = object._text2;
    }

    oop::Data::~Data(){} //tu chyba nic nie jest potrzebne

//funkcje*******************************************************************************************************
    void oop::Data::first_data(char* data){}

    std::string oop::Data::first()const
    {return std::string(" ");}

    std::string oop::Data::second(std::string data)const
    {return std::string(" ");}

   /* const char* oop::Data::full_data(const std::string data)
    {return " ";}*/
    void oop::Data::full_data(const std::string data)
    {
        int size = data.size();
        int space = data.find(' ');
        //_text1 = data.substr(0,space);
       // _text2 = data.substr(space,size);



    return ;}

    const char* oop::Data::full_data()
    {return " ";}

    oop::Data oop::Data::to_upper(void)const
    {return *this;}

    oop::Data oop::Data::to_lower(void)const
    {return *this;}

    const char* oop::Data::second()const
    {return " ";}

【问题讨论】:

  • 请把表扬改成英文好吗?
  • 它给出了什么输出,你期望什么?
  • @b4hand my psychic power predict: /* 输出:a = ["Pierwszy", "Drugi"] b = ["Tekst testowy", "Tekst testowy"] c = Test-first, Test -second d = ["PIERWSZY", "DRUGI"] e = ["pierwszy", "drugi"] */
  • 在您开始怀疑构造函数或拆分字符串之前,您应该担心您的 funkcje 完全没有实现。 (您真的对什么都不做或返回" " 会产生错误的结果感到惊讶吗?)在开始将字符串分成更多字符串之前,让其余的代码正常工作。另外,如果您被允许std::string,请始终如一地这样做。

标签: c++ string constructor


【解决方案1】:

有很多方法可以做到这一点。这里有两个:

快捷方式:串流

stringstream ss(data);
string tstr;
ss >> tstr;  // every call to >> reads one bunch of characters up to the first whitespace.

然后制作一个大小合适的char数组,将tstr复制到char数组中,并将char数组赋值给_text1。重复 _text2。一个问题:像“the quick brown fox”这样的字符串会变成“the”,而剩下的字符串会丢失。

困难的方法:find and substr

string tstr;
size_t loc = data.find(' ');
if (loc != data.npos)
{
    tstr = data.substr(0, loc);
    //Copy tstr into _text1
    tstr = data.substr(loc + 1, data.npos);
    //Copy tstr into _text2
}

这个更适合“快速棕色狐狸”的案例。它会产生“the”和“quick brown fox”。

【讨论】:

    猜你喜欢
    • 2016-07-28
    • 1970-01-01
    • 2016-01-11
    • 2013-02-03
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多