Строковая функция возвращает странное значение

У меня есть функция, возвращающая двоичное представление байта:

std::string ToBinary(unsigned char &Num)
{
    char str[8];
    char Symb = 0;
    int i = 0;
    while (i<8)
    {
        _asm
        {
            //push al
            shr byte[Num], 1
            mov al, 0
            adc al, 30h
            mov byte[Symb], al
            //pop al
        }
        str[7-i] = Symb;
        i++;
    }
    return std::string(str);
}

И это зов:

std::string BinOut = ToBinary(ByteValue);

Проблема в том, что вместо строки из 8 символов он возвращает строку из 14 символов. Очевидно, что внутри функции str показывает правильное значение. Как сделать так, чтобы он возвращал 8 символов?

Прочтите ericlippert.com/2014/03/05/how-to-debug-small-programs для получения советов по отладке вашего кода.

Code-Apprentice 08.10.2018 16:55
return std::string(str, 8); См. (4) в: en.cppreference.com/w/cpp/string/basic_string/basic_string Не требует завершения NULL и допускает встроенные NULL.
Richard Critten 08.10.2018 16:56
str не имеет нулевого конца, поэтому у вас есть UB
bolov 08.10.2018 16:57
Silly mistake: forgot about null terminator Это ответ? Если да, пожалуйста, не помещайте это в свой вопрос. Вместо этого проголосуйте за некоторые ответы, в которых указана ошибка, и примите ее, если вас устраивает ответ.
hellow 08.10.2018 17:02
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
77
2

Ответы 2

Проблема вызвана тем, что ваш символьный массив не содержит завершающего нулевого символа. Одно из решений - выделить массив с одним дополнительным символом, чтобы вы могли завершить его нулевым значением:

char str[9]
//...
str[8] = '\0'

В качестве альтернативы вы можете использовать перегруженный конструктор строк, который позволяет вам передать параметр для количества используемых символов из входного массива:

std :: string (str, 8);

Это перебор. Просто используйте другую перегрузку std::string. Это также не будет работать должным образом в общем случае (где в последовательности БУДЕТ нулевой байт!)

SergeyA 08.10.2018 16:58

@SergeyA Да, я предполагаю, что предыдущий код правильно строит массив из 8 ненулевых символов.

Code-Apprentice 08.10.2018 17:02

Конструктор std::string, который принимает указатель на char, требует, чтобы указанная строка оканчивалась нулем. Ваш str не имеет нулевого конца, поэтому поведение программы не определено.

Вы также можете

  • Используйте char[9] и установите последний символ на '\0'. Это работает только в том случае, если str не содержит нулевых байтов, поскольку первый из них будет терминатором.
  • Или используйте конструктор std::string(char *s, std::size_t count), у которого нет такого требования.

Вы также можете сохранить char str[8];, а затем использовать return {std::begin(str), std::end(str)}; для инициализации возвращаемой строки.

NathanOliver 08.10.2018 17:04

Другие вопросы по теме