Возвращение строки из функции, имеющей несколько NULL '\ 0' в C ++

0

Я сжимаю строку. И сжатая строка иногда имеет NULL-символ внутри до конца NULL. Я хочу вернуть строку до конца null. Но функция компрессора возвращает жало до появления первого NULL. Я задал вопрос до этого раньше. Но последовательно мне также нужно решение в C++ сейчас и в следующем С#. Пожалуйста, помогите мне. Спасибо.

char* compressor(char* str)
    {
      char *compressed_string;
      //After some calculation
      compressed_string="bk'NULL'dk";// at the last here is automatic  an NULL we all know
    return compressed_string;
    }
void main()
   {
    char* str;
    str=compressor("Muhammad Ashikuzzaman");
    printf("Compressed Value = %s",str);

   }

Выход: Сжатое value = bk; И всех других персонажей из функции компрессора здесь нет. Есть ли способ показать всю строку.

  • 1
    Не пишите дерьмовый C на C ++.
  • 1
    Разве это не ответило на вопрос ?: stackoverflow.com/questions/25835422/… . Этот ответ не только возвращает строку со всеми нулями, но и печатает всю строку, включая нули (даже если они будут невидимыми).
Показать ещё 8 комментариев
Теги:
string
compression

1 ответ

3

Основная проблема, которую вы испытываете, заключается в том, что алгоритмы сжатия работают с двоичными данными, а не с текстом. Если вы сжимаете что-то, тогда ожидайте, что некоторые из сжатых байтов будут равны нулю. Таким образом, сжатые данные не могут быть сохранены в строке с нулевым завершением.

Вам нужно изменить свое мышление для работы с двоичными данными.

Для сжатия выполните следующие действия:

  1. Преобразуйте из текста в двоичный код с помощью определенной четкой кодировки. Например, UTF-8. Это приведет к массиву unsigned char.
  2. Сжатие unsigned char, который снова даст массив unsigned char, но теперь сжат.

Чтобы распаковать, вы просто отменяете эти шаги.

Поскольку вы пишете код C++, вам будет рекомендовано использовать стандартные контейнеры. Например, std::string или std::wstring и std::vector<T>.

Точно такие же принципы применяются на всех языках. Когда вы приходите, чтобы закодировать это на С#, вам нужно преобразовать из текста в двоичный. Используйте Encoding.GetBytes() для этого. Это дает байтовый массив, byte[]. Сжатие этого в другой массив байтов. И так далее.

Но вы действительно должны сначала преодолеть это желание попытаться сохранить двоичные данные в текстовых типах данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню