Замена символа в выводном потоке - на консоль выводятся нечитаемые символы - C (СИ)
Формулировка задачи:
Всем привет!
Начал изучать программирование на Си. Как и полагается начал с Кернигана и Ричи. Столкнулся с небольшой трудностью в приведенной задаче (задача в коммнетарии к коду):
Код успешно компилируется и выполняется, однако вместо заданных символов консоль выдает кракозябры.
IDE - Geany
ОС - Debian GNU/Linux
Компилятор - gcc
/* tabreplace - заменяет знак табуляци на \t, backspace на \b, и \ на \\ */
#include <stdio.h>
main ()
{
int c;
while ((c = getchar ()) != EOF) {
if (c == 9) {
c = "\t";
}
if (c == 8) {
c = "\b";
}
if (c == 92) {
c = "\\";
}
putchar (c);
}
}Решение задачи: «Замена символа в выводном потоке - на консоль выводятся нечитаемые символы»
textual
Листинг программы
#include <stdio.h>
int main(void)
{
char s[100];
char c;
int i=0;
while ( i<100 && ( c = getc (stdin) ) != '\n' )
{
switch (c)
{
case '\t' : s[i++]='\\';s[i++]='t';break;
case 8 : s[i++]='\\';s[i++]='b';break;
case '\\' : s[i++]='\\';s[i++]='\\'; break;
default:s[i++]=c;
}
}
s[i]=0;
puts(s);
return 0;
}
Объяснение кода листинга программы
В этом коде выполняется замена определённых символов в выводном потоке. Вот список действий, которые выполняются в коде:
- Вводится строка
s[100], которая будет использоваться для хранения входной строки. - Вводится символ
c, который будет использоваться для проверки каждого вводимого символа. - Инициализируется счётчик
iравным 0. - Запускается цикл while, который будет выполняться до тех пор, пока не будет введено 100 символов или не будет введён символ новой строки.
- Для каждого вводимого символа выполняется проверка с помощью оператора switch.
- Если введённый символ является табуляцией (
\t), то в строкуsзаписываются два символа обратной косой черты (\\). - Если введённый символ является обратной косой чертой (
\\), то в строкуsзаписываются два символа обратной косой черты. - Если введённый символ является восьмёркой (8), то в строку
sзаписываются два символа обратной косой черты. - Если введённый символ не является ни одним из вышеперечисленных, то он просто добавляется в строку
s. - После окончания цикла while, в строку
sдобавляется нулевой символ, чтобы обозначить конец строки. - Строка
sвыводится на консоль с помощью функцииputs. - Код завершается и возвращает 0, что означает успешное выполнение.