История изменений
Исправление 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;
}
А если переходить от теории к практике, то расскажи чего конкретно ты хочешь добиться (т. е. для чего тебе это нужно), тогда тебе подскажут как это лучше сделать.