LINUX.ORG.RU

История изменений

Исправление Kroz, (текущая версия) :

Ты путаешь тёплое с красным.

Принципа всего два:
1. C имеет null-terminated строки. Если хочешь, это единственное исключение из «стандарта ASCII» в твоем понимании. Если по каким-то соображениям это не подходит, используй работу с массивами + посимвольный вывод, либо std::string из C++.

2. Управляющие символы ASCII обрабатываются терминалом. Не языком программирования - терминалом. Например, принтером, виртуальным терминалом unix и т. п. Так что в любом языке программирования, если ты выводишь символ \n, то это в терминале POSIX будет перевод строки.

printf(«Some\0 string»);
Покажет «Some», но не «Some string», как должно быть согласно ascii

Это особенность null-terminated строк в любом языке программирования. И к ASCII не имеет никакого отношения. Если нужно поведение как в «стандарте ASCII» используй посимволый вывод или std::string; см. пример ниже.

В тоже время, «0x4» не сработает.

End of Transmission
Что ты ожидаешь от этого символа при выводе? Это Ctrl+D при вводе и соответствует EOF при работе с потоками.

0x08 срабатывает не всегда

Backspace
Как и любой управляющий символ, поведение на выходе зависит от терминала
Кстати, мы помним, что это лишь перевод курсора вправо, а не стирание, так?

P. S. Еще мы помним, что \n работает только в Unix. Если нужно переносимое решение, используем std::endl в C++.

Вот тебе демо, где всё работает как нужно.

C:

#include<stdio.h>

int main()
{
	char str[] = "Word1\x08 word2\x04 word3\x00 word4";

	// Вывод NULL-terminated строки, то есть до первого символа \0
	printf("%s", str);
	printf("\n"); // Гарантирована корректная работа только в терминалах POSIX

	// Вывод всех символов
	// Обращаем внимание, что Backspace работает как надо, несмотря на то, что выводится не строка, а отдельные символы. Обработка символа Backspace производится именно терминалом.
	int i;
	for(i = 0; i < sizeof(str); i++)
			printf("%c", str[i]);
	printf("\n"); // Гарантирована корректная работа только в терминалах POSIX

	return 0;
}


C++:
#include<string>
#include<iostream>

int main()
{
	char str_c[] = "Word1\x08 word2\x04 word3\x00 word4";

	// Строковые константы в C/C++ - NULL-terminated; если нужно передать всё, передаем массив
	std::string str(str_c, sizeof(str_c)/sizeof(str_c[0]));

	// std::string - не-NULL-terminated, так что выведется всё
	std::cout << str;
	std::cout << std::endl; // Кросс-платформенное решение

	return 0;
}



А если переходить от теории к практике, то расскажи чего конкретно ты хочешь добиться (т. е. для чего тебе это нужно), тогда тебе подскажут как это лучше сделать.

Исправление Kroz, :

Ты путаешь тёплое с красным.

Принципа всего два:
1. C имеет null-terminated строки. Если хочешь, это единственное исключение из «стандарта ASCII» в твоем понимании. Если по каким-то соображениям это не подходит, используй работу с массивами + посимвольный вывод, либо std::string из C++.

2. Управляющие символы ASCII обрабатываются терминалом. Не языком программирования - терминалом. Например, принтером, виртуальным терминалом unix и т. п. Так что в любом языке программирования, если ты выводишь символ \n, то это в терминале POSIX будет перевод строки.

printf(«Some\0 string»);
Покажет «Some», но не «Some string», как должно быть согласно ascii

Это особенность null-terminated строк в любом языке программирования. И к ASCII не имеет никакого отношения. Если нужно поведение как в «стандарте ASCII» используй посимволый вывод или std::string; см. пример ниже.

В тоже время, «0x4» не сработает.

End of Transmission
Что ты ожидаешь от этого символа при выводе? Это Ctrl+D при вводе и соответствует EOF при работе с потоками.

0x08 срабатывает не всегда

Backspace
Как и любой управляющий символ, поведение на выходе зависит от терминала
Кстати, мы помним, что это лишь перевод курсора вправо, а не стирание, так?

P. S. Еще мы помним, что \n работает только в Unix. Если нужно переносимое решение, используем std::endl в C++.

Вот тебе демо, где всё работает как нужно.

C:

#include<stdio.h>

int main()
{
	char str[] = "Word1\x08 word2\x04 word3\x00 word4";

	// Вывод NULL-terminated строки, то ест до первого символа \0
	printf("%s", str);
	printf("\n"); // Гарантирована корректная работа только в терминалах POSIX

	// Вывод всех символов
	// Обращаем внимание, что Backspace работает как надо, несмотря на то, что выводится не строка, а отдельные символы. Обработка символа Backspace производится именно терминалом.
	int i;
	for(i = 0; i < sizeof(str); i++)
			printf("%c", str[i]);
	printf("\n"); // Гарантирована корректная работа только в терминалах POSIX

	return 0;
}


C++:
#include<string>
#include<iostream>

int main()
{
	char str_c[] = "Word1\x08 word2\x04 word3\x00 word4";

	// Строковые константы в C/C++ - NULL-terminated; если нужно передать всё, передаем массив
	std::string str(str_c, sizeof(str_c)/sizeof(str_c[0]));

	// std::string - не-NULL-terminated, так что выведется всё
	std::cout << str;
	std::cout << std::endl; // Кросс-платформенное решение

	return 0;
}



А если переходить от теории к практике, то расскажи чего конкретно ты хочешь добиться (т. е. для чего тебе это нужно), тогда тебе подскажут как это лучше сделать.

Исправление Kroz, :

Ты путаешь тёплое с красным.

Принципа всего два:
1. C имеет null-terminated строки. Если хочешь, это единственное исключение из «стандарта ASCII» в твоем понимании. Если по каким-то соображениям это не подходит, используй работу с массивами + посимвольный вывод, либо std::string из C++.

2. Управляющие символы ASCII обрабатываются терминалом. Не языком программирования - терминалом. Например, принтером, виртуальным терминалом unix и т. п. Так что в любом языке программирования, если ты выводишь символ \n, то это в терминале POSIX будет перевод строки.

printf(«Some\0 string»);
Покажет «Some», но не «Some string», как должно быть согласно ascii

Это особенность null-terminated строк в любом языке программирования. И к ASCII не имеет никакого отношения. Если нужно поведение как в «стандарте ASCII» используй посимволый вывод или std::string; см. пример ниже.

В тоже время, «0x4» не сработает.

End of Transmission
Что ты ожидаешь от этого символа при выводе? Это Ctrl+D при вводе и соответствует EOF при работе с потоками.

0x08 срабатывает не всегда

Backspace
Как и любой управляющий символ, поведение на выходе зависит от терминала
Кстати, мы помним, что это лишь перевод курсора вправо, а не стирание, так?

P. S. Еще мы помним, что \n работает только в Unix. Если нужно переносимое решение, используем std::endl в C++.

Вот тебе демо, где всё работает как нужно.

C:

#include<stdio.h>

int main()
{
	char str[] = "Word1\x08 word2\x04 word3\x00 word4";

	// Вывод NULL-terminated строки
	printf("%s", str);
	printf("\n"); // Гарантирована корректная работа только в терминалах POSIX

	// Вывод всех символов
	// Обращаем внимание, что Backspace работает как надо, несмотря на то, что выводится не строка, а отдельные символы. Обработка символа Backspace производится именно терминалом.
	int i;
	for(i = 0; i < sizeof(str); i++)
			printf("%c", str[i]);
	printf("\n"); // Гарантирована корректная работа только в терминалах POSIX

	return 0;
}


C++:
#include<string>
#include<iostream>

int main()
{
	char str_c[] = "Word1\x08 word2\x04 word3\x00 word4";

	// Строковые константы в C/C++ - NULL-terminated; если нужно передать всё, передаем массив
	std::string str(str_c, sizeof(str_c)/sizeof(str_c[0]));

	// std::string - не-NULL-terminated, так что выведется всё
	std::cout << str;
	std::cout << std::endl; // Кросс-платформенное решение

	return 0;
}



А если переходить от теории к практике, то расскажи чего конкретно ты хочешь добиться (т. е. для чего тебе это нужно), тогда тебе подскажут как это лучше сделать.

Исправление Kroz, :

Ты путаешь тёплое с красным.

Принципа всего два:
1. C имеет null-terminated строки. Если хочешь, это единственное исключение из «стандарта ASCII» в твоем понимании. Если по каким-то соображениям это не подходит, используй работу с массивами + посимвольный вывод, либо std::string из C++.

2. Управляющие символы ASCII обрабатываются терминалом. Не языком программирования - терминалом. Например, принтером, виртуальным терминалом unix и т. п. Так что в любом языке программирования, если ты выводишь символ \n, то это в терминале POSIX будет перевод строки.

printf(«Some\0 string»);
Покажет «Some», но не «Some string», как должно быть согласно ascii

Это особенность null-terminated строк в любом языке программирования. И к ASCII не имеет никакого отношения. Если нужно поведение как в «стандарте ASCII» используй посимволый вывод или std::string; см. пример ниже.

В тоже время, «0x4» не сработает.

End of Transmission
Что ты ожидаешь от этого символа при выводе? Это Ctrl+D при вводе и соответствует EOF при работе с потоками.

0x08 срабатывает не всегда

Backspace
Как и любой управляющий символ, поведение на выходе зависит от терминала
Кстати, мы помним, что это лишь перевод курсора вправо, а не стирание, так?

P. S. Еще мы помним, что \n работает только в Unix. Если нужно переносимое решение, используем std::endl в C++.

Вот тебе демо.

C:

#include<stdio.h>

int main()
{
	char str[] = "Word1\x08 word2\x04 word3\x00 word4";

	// Вывод NULL-terminated строки
	printf("%s", str);
	printf("\n"); // Гарантирована корректная работа только в терминалах POSIX

	// Вывод всех символов
	// Обращаем внимание, что Backspace работает как надо, несмотря на то, что выводится не строка, а отдельные символы. Обработка символа Backspace производится именно терминалом.
	int i;
	for(i = 0; i < sizeof(str); i++)
			printf("%c", str[i]);
	printf("\n"); // Гарантирована корректная работа только в терминалах POSIX

	return 0;
}


C++:
#include<string>
#include<iostream>

int main()
{
	char str_c[] = "Word1\x08 word2\x04 word3\x00 word4";

	// Строковые константы в C/C++ - NULL-terminated; если нужно передать всё, передаем массив
	std::string str(str_c, sizeof(str_c)/sizeof(str_c[0]));

	// std::string - не-NULL-terminated, так что выведется всё
	std::cout << str;
	std::cout << std::endl; // Кросс-платформенное решение

	return 0;
}



А если переходить от теории к практике, то расскажи чего конкретно ты хочешь добиться (т. е. для чего тебе это нужно), тогда тебе подскажут как это лучше сделать.

Исходная версия Kroz, :

Ты путаешь тёплое с красным.

Принципа всего два:
1. C имеет null-terminated строки. Если хочешь, это единственное исключение из «стандарта ASCII» в твоем понимании. Если по каким-то соображениям это не подходит, используй работу с массивами + посимвольный вывод, либо std::string из C++.

2. Управляющие символы ASCII обрабатываются терминалом. Не языком программирования - терминалом. Например, принтером, виртуальным терминалом unix и т. п. Так что в любом языке программирования, если ты выводишь символ \n, то это в стандартном терминале unix будет перевод строки.

printf(«Some\0 string»);
Покажет «Some», но не «Some string», как должно быть согласно ascii

Это особенность null-terminated строк в любом языке программирования. И к ASCII не имеет никакого отношения.

В тоже время, «0x4» не сработает.

End of Transmission
Что ты ожидаешь от этого символа при выводе? Это Ctrl+D при вводе и соответствует EOF при работе с потоками.

0x08 срабатывает не всегда

Backspace
Как и любой управляющий символ, поведение на выходе зависит от терминала
Кстати, мы помним, что это лишь перевод курсора вправо, а не стирание, так?

P. S. Еще мы помним, что \n работает только в Unix. Если нужно переносимое решение, используем std::endl в C++.

Вот тебе демо.

C:

#include<stdio.h>

int main()
{
	char str[] = "Word1\x08 word2\x04 word3\x00 word4";

	// Вывод NULL-terminated строки
	printf("%s", str);
	printf("\n"); // Гарантирована корректная работа только в терминалах POSIX

	// Вывод всех символов
	// Обращаем внимание, что Backspace работает как надо, несмотря на то, что выводится не строка, а отдельные символы. Обработка символа Backspace производится именно терминалом.
	int i;
	for(i = 0; i < sizeof(str); i++)
			printf("%c", str[i]);
	printf("\n"); // Гарантирована корректная работа только в терминалах POSIX

	return 0;
}


C++:
#include<string>
#include<iostream>

int main()
{
	char str_c[] = "Word1\x08 word2\x04 word3\x00 word4";

	// Строковые константы в C/C++ - NULL-terminated; если нужно передать всё, передаем массив
	std::string str(str_c, sizeof(str_c)/sizeof(str_c[0]));

	// std::string - не-NULL-terminated, так что выведется всё
	std::cout << str;
	std::cout << std::endl; // Кросс-платформенное решение

	return 0;
}



А если переходить от теории к практике, то расскажи чего конкретно ты хочешь добиться (т. е. для чего тебе это нужно), тогда тебе подскажут как это лучше сделать.