Для следующего кода на моем ПК char \0
всегда приводит к пробелу (при печати с использованием cout
). Тем не менее, на ПК моего друга, результат char \0
всегда приводит к символу a
, Код и скриншоты выглядят следующим образом:
#include <iostream>
using namespace std;
// Function main
int main()
{
cout << "xxx" << '\0' << "yyy" << endl;
return 0;
}
Оставил: на моем ПК. Правильно: на компьютере моего друга.
Что тут происходит? Почему результаты на разных компьютерах разные?
PS:
Результаты все равно будут отличаться, даже если мы будем использовать один и тот же исполняемый файл exe
файл (т.е. скомпилирован на моем компьютере и работает на обоих компьютерах).
Мы оба используем Visual Studio 2010 также с одинаковым набором символов проекта.
Здесь может быть некоторый переполнение буфера, но, пожалуйста, обратите внимание на то, что я буду всегда получить space
пока мой друг всегда получить чар a
,
Он имеет ту же функцию, если мы оба делаем cout<<ends
.
Для «непечатаемого символа» (который для ASCII находится вне диапазона 0x20-0x7e [*]), вывод технически не определен, и фактический визуальный вывод будет зависеть от нескольких вещей:
Фактическое устройство вывода — если вы просматриваете символ в командной строке Windows, он может выглядеть иначе, чем окно терминала в Linux, и при использовании подлинного (30+ лет) терминала VT100 он, скорее всего, снова будет выглядеть по-другому. (Фактически, когда я впервые использовал для написания кода для терминалов, которые использовали последовательный ввод, мы использовали для «заполнения» определенных управляющих последовательностей символами NUL, потому что терминал отбрасывал некоторые символы, когда escape-последовательность была «сложной» — скажем, ясно — экран, он может не получить следующие 5-6 символов, поэтому мы добавили бы дополнительные 10 символов NUL, чтобы мы потеряли NUL, а не часть значимого текста, который мы хотели напечатать на экране).
Когда это применимо, шрифт, выбранный для отображения текста, также может иметь значение (это имеет место в данной конкретной ситуации, но не полагайтесь на это). Конечно, это относится и к печатным символам, но кроме некоторых «специальных» шрифтов (Zapf Dingbats, Symbols являются очевидными примерами), «диапазон печати» действительно соответствует ожидаемому. «Непечатаемый» диапазон не так хорошо определен.
Метод фактической печати — например, с использованием cout
или же printf
будет иметь другой результат, чем «вставка символов в буфер кадровой памяти на ПК [в текстовом режиме]».
Для получения согласованных результатов печати непечатных символов вам нужно будет обработать их во что-то, что определено как печатные.
[*] Многие системы поддерживают расширенные диапазоны, например, исходный IBM / PC имеет диапазон 0x20-0xff, а современные системы используют несколько байтов для представления символов, которые «не печатаются», например, в кодировке UTF-8, где обычно используемые символы [на европейских языках] кодируются одним байтом, а менее распространенные символы получают кодировку из двух, трех или четырех байтов. Даже здесь фактический результат зависит от выбранного шрифта.Характер \0
или ASCII 0
, не является печатным символом, стандартного способа его вывода нет.
Диапазон печати ASCII от 0x20
в 0x7E
, увидеть Википедия: ASCII
Как уже говорилось, это определяется реализацией. На моем терминале я получаю ^@
, NULL
терминатор используется для печати строк, но в этом случае вы пытаетесь вывести сам символ (и он будет иметь различные представления, от случайных символов до нуля).
'\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'
), а затем вы печатаете память, которая находится вне выделенного блока, и то, что вы печатаете, тогда не определено.
Редактировать:
Это действительно странно, то, что вы говорите, не имеет смысла, пожалуйста, напишите все вы код
#include < iostream >
using namespace std;
int main()
{
cout << "xxx" << '\0' << "yyy" << endl;
return 0;
}
Я не знаю, почему вы получаете разные o / p.
проверьте один раз с g ++. Я получил это O / P с G ++