std::string

Initialization

#include <gtest/gtest.h>
#include <string>

TEST(string_suite, initialization)
{
    std::string hello("Hello");                 // <--- "const char*" ctor 
    std::string another_hello = hello;          // <--- copy ctor
    std::string who = "Joerg";                  // <--- "const char*" ctor (assignment style)
}

Addition, And Such

#include <gtest/gtest.h>
#include <string>

TEST(string_suite, addition)
{
    std::string hello = "Hello";
    std::string who = "Joerg";
    
    std::string greeting1 = hello + " " + who;  // <--- inefficient
    ASSERT_EQ(greeting1, "Hello Joerg");

    std::string greeting2 = hello;
    greeting2 += ' ';                           // <--- a little better
    greeting2 += who;                           // <--- a little better
}

Conversion From String

// file:///tmp/jfasch-home/html/trainings/material/soup/c/020-types-operators-expressions/080-type-conversions/topic.html

// stol -> long
// stoll -> long long
#include <gtest/gtest.h>
#include <string>

TEST(string_suite, convert_to_signed_integer)
{
    {
        std::string numstr = "42";
        int answer = std::stoi(numstr);
        ASSERT_EQ(answer, 42);
    }
    {
        std::string numstr = "42";
        int answer = std::stoi(numstr, /*start pos*/0, /*base*/16);
        ASSERT_EQ(answer, 66);
    }
}
// file:///tmp/jfasch-home/html/trainings/material/soup/c/020-types-operators-expressions/080-type-conversions/topic.html

// stoull
// no stoui
// base, etc like signed
#include <gtest/gtest.h>
#include <string>

TEST(string_suite, convert_to_unsigned_integer)
{
    {
        std::string numstr = "42";
        unsigned long answer = std::stoul(numstr);
        ASSERT_EQ(answer, 42);
    }
    {
        std::string numstr = "-42";
        unsigned long answer = std::stoul(numstr); // <--- for sure not negative
        (void)answer;
    }
}

Conversion To String

// bring table:
// https://en.cppreference.com/w/cpp/string/basic_string/to_string
#include <gtest/gtest.h>
#include <string>

TEST(string_suite, convert_from_something)
{
    int i = 42;
    std::string i_str = std::to_string(i);
    ASSERT_EQ(i_str, "42");

    unsigned int ui = 42;
    std::string ui_str = std::to_string(ui);
    ASSERT_EQ(ui_str, "42");

    double d = 42.666;
    std::string d_str = std::to_string(d);
    ASSERT_EQ(d_str, "42.666000");    // sprintf default precision is 6
}

Searching

#include <gtest/gtest.h>
#include <string>

TEST(string_suite, find)
{
    std::string s = "Mississippi";
    size_t pos = s.find("ss");
    ASSERT_EQ(pos, 2);

    pos = s.find('s');
    ASSERT_EQ(pos, 2);

    pos = s.find("ss", 3);
    ASSERT_EQ(pos, 5);
}

Substrings

#include <gtest/gtest.h>
#include <string>

TEST(string_suite, substr)
{
    std::string s = "Mississippi";
    std::string is = s.substr(1, /*substring length:*/2);
    ASSERT_EQ(is, "is");
}