@kos_dev

Как положить в unsigned char NULL тип и после успешно отловить успешное сравнение с другим unsigned char или char?

Здравствуйте. Вопрос из двух частей.

Первая часть:
Что лучше класть в тип unsigned char, чтобы использовать это как пустое значение. Когда кладется NULL, то в переменной хранится '\0' последовательность, не уверен, что это лучший вариант, мало ли она каким-то образом может храниться в подобной переменной, при занесении в нее данных или при ее объявлении.
Делаю примерно так:
Присваиваю переменной unsigned char NULL значение
unsigned char ch = NULL; // '\0'


Вторая часть:
Никак не могу успешно сравнить две переменные unsigned char, пытался явным образом преобразовывать их к int, пытался сравнивать unsigned char и char, ничего не работает, хотя в переменных лежит идентичное значение, к примеру
'п' и 'п', но сравнение их возвращает false.
Примеры безуспешных сравнений:
Попытка сравнить unsigned char и unsigned char
unsigned char[255]; 
vector<unsigned char> text;
// Далее через цикл каждое значение делаю NULL, char[i] = NULL;
// После идут пара циклов, в которых происходит сравнение
if(char[i] == text[j]) cout << "Успех, переменные имеют одинаковое значение";
else cout << "Неудача";

Попытка сравнить с char, который вытаскиваем из string
unsigned char[255]; 
string text;
// Далее через цикл каждое значение делаю NULL, char[i] = NULL;
// После идут пара циклов, в которых происходит сравнение
if(char[i] == string[j]) cout << "Успех, переменные имеют одинаковое значение";
else cout << "Неудача";

Сравниваем явным приведением к int
unsigned char[255]; 
string text;
// Далее через цикл каждое значение делаю NULL, char[i] = NULL;
// После идут пара циклов, в которых происходит сравнение
if((int)char[i] == (int)string[j]) cout << "Успех, переменные имеют одинаковое значение";
else cout << "Неудача";
  • Вопрос задан
  • 199 просмотров
Решения вопроса 1
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Специально для этого в C++ начиная с 17 версии стандарта завезли std::optional

Эта штука позволяет хранить внутри себя значение или помнить, что значение в данный момент не задано.
Пример:
#include <optional>
using ochar = std::optional<char>;

ochar a = 'a';
ochar b;

if(a) { std::cout << " a exists and contains " << *a << std::endl;}
if(!b) {std::cout << " b does not exist" << std::endl;}

Пример из мануала:
#include <string>
#include <functional>
#include <iostream>
#include <optional>
 
// optional can be used as the return type of a factory that may fail
std::optional<std::string> create(bool b) {
    if (b)
        return "Godzilla";
    return {};
}
 
// std::nullopt can be used to create any (empty) std::optional
auto create2(bool b) {
    return b ? std::optional<std::string>{"Godzilla"} : std::nullopt;
}
 
// std::reference_wrapper may be used to return a reference
auto create_ref(bool b) {
    static std::string value = "Godzilla";
    return b ? std::optional<std::reference_wrapper<std::string>>{value}
             : std::nullopt;
}
 
int main()
{
    std::cout << "create(false) returned "
              << create(false).value_or("empty") << '\n';
 
    // optional-returning factory functions are usable as conditions of while and if
    if (auto str = create2(true)) {
        std::cout << "create2(true) returned " << *str << '\n';
    }
 
    if (auto str = create_ref(true)) {
        // using get() to access the reference_wrapper's value
        std::cout << "create_ref(true) returned " << str->get() << '\n';
        str->get() = "Mothra";
        std::cout << "modifying it changed it to " << str->get() << '\n';
    }
}


Важное отличие от использования, например, указателя - optional не делает динамических выделений памяти, значение хранится (или не хранится) прямо у нее внутри.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы