Разные результаты при печати ‘\ 0’ на разных ПК?

Для следующего кода на моем ПК char \0 всегда приводит к пробелу (при печати с использованием cout). Тем не менее, на ПК моего друга, результат char \0 всегда приводит к символу a, Код и скриншоты выглядят следующим образом:

#include <iostream>
using namespace std;

// Function main
int main()
{
cout << "xxx" << '\0' << "yyy" << endl;
return 0;
}

введите описание изображения здесь введите описание изображения здесь

Оставил: на моем ПК. Правильно: на компьютере моего друга.

Что тут происходит? Почему результаты на разных компьютерах разные?

PS:

  1. Результаты все равно будут отличаться, даже если мы будем использовать один и тот же исполняемый файл exe файл (т.е. скомпилирован на моем компьютере и работает на обоих компьютерах).

  2. Мы оба используем Visual Studio 2010 также с одинаковым набором символов проекта.

  3. Здесь может быть некоторый переполнение буфера, но, пожалуйста, обратите внимание на то, что я буду всегда получить space пока мой друг всегда получить чар a,

  4. Он имеет ту же функцию, если мы оба делаем cout<<ends.

3

Решение

Для «непечатаемого символа» (который для ASCII находится вне диапазона 0x20-0x7e [*]), вывод технически не определен, и фактический визуальный вывод будет зависеть от нескольких вещей:

  1. Фактическое устройство вывода — если вы просматриваете символ в командной строке Windows, он может выглядеть иначе, чем окно терминала в Linux, и при использовании подлинного (30+ лет) терминала VT100 он, скорее всего, снова будет выглядеть по-другому. (Фактически, когда я впервые использовал для написания кода для терминалов, которые использовали последовательный ввод, мы использовали для «заполнения» определенных управляющих последовательностей символами NUL, потому что терминал отбрасывал некоторые символы, когда escape-последовательность была «сложной» — скажем, ясно — экран, он может не получить следующие 5-6 символов, поэтому мы добавили бы дополнительные 10 символов NUL, чтобы мы потеряли NUL, а не часть значимого текста, который мы хотели напечатать на экране).

  2. Когда это применимо, шрифт, выбранный для отображения текста, также может иметь значение (это имеет место в данной конкретной ситуации, но не полагайтесь на это). Конечно, это относится и к печатным символам, но кроме некоторых «специальных» шрифтов (Zapf Dingbats, Symbols являются очевидными примерами), «диапазон печати» действительно соответствует ожидаемому. «Непечатаемый» диапазон не так хорошо определен.

  3. Метод фактической печати — например, с использованием cout или же printf будет иметь другой результат, чем «вставка символов в буфер кадровой памяти на ПК [в текстовом режиме]».

Для получения согласованных результатов печати непечатных символов вам нужно будет обработать их во что-то, что определено как печатные.

[*] Многие системы поддерживают расширенные диапазоны, например, исходный IBM / PC имеет диапазон 0x20-0xff, а современные системы используют несколько байтов для представления символов, которые «не печатаются», например, в кодировке UTF-8, где обычно используемые символы [на европейских языках] кодируются одним байтом, а менее распространенные символы получают кодировку из двух, трех или четырех байтов. Даже здесь фактический результат зависит от выбранного шрифта.

2

Другие решения

Характер \0или ASCII 0, не является печатным символом, стандартного способа его вывода нет.

Диапазон печати ASCII от 0x20 в 0x7E, увидеть Википедия: ASCII

6

Как уже говорилось, это определяется реализацией. На моем терминале я получаю ^@, NULL терминатор используется для печати строк, но в этом случае вы пытаетесь вывести сам символ (и он будет иметь различные представления, от случайных символов до нуля).

1

'\0' является символом завершения, чтобы знать, где заканчивается строка, поэтому, например, это напечатает ab:

#include <iostream>

int main(int argc, char* argv[])
{
char str[]= { 'a', 'b', '\0' };
std::cout <<str<< std::endl;
return 0;
}

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

Пространство, о котором вы говорите, вероятно, вызвано std::endl

Здесь нет неопределенного поведения, неопределенное поведение обычно вызывается в обратном случае, где есть нет символ завершения ('\0'), а затем вы печатаете память, которая находится вне выделенного блока, и то, что вы печатаете, тогда не определено.

Редактировать:

Это действительно странно, то, что вы говорите, не имеет смысла, пожалуйста, напишите все вы код

0
#include < iostream >
using namespace std;
int main()
{
cout << "xxx" << '\0' << "yyy" << endl;
return 0;
}

Я не знаю, почему вы получаете разные o / p.
проверьте один раз с g ++. Я получил это O / P с G ++

введите описание изображения здесь

0
По вопросам рекламы [email protected]