Тема: Як передати змінній символ?

Чи можна передати змінній, наприклад с, символ табуляції?
Якось так:

...
int c;

c = \t;
...

Або так:

...
int c;

c = '\t';
...

Або дізнатись значення (індекс, номер) символу, цей номер надати змінній, а потім вивести?

...
int c;

c = 9;

printf("%d", c);
...

Весь приведений код не виконує того, що потрібно мені, а мені потрібно в потоці вводу/виводу навчитись керувати \t \n \b...

Білий Лунь

2

Re: Як передати змінній символ?

MSVC чи як там компілятор від майкрософту називається

#include <stdio.h>
#include <stdlib.h>



int main()
{
    char test = '\n';

    printf_s("bla bal bal %cbla sdg bdl %c", test, test);
    system("pause");
    return EXIT_SUCCESS;
}
Подякували: Ярослав1

3 Востаннє редагувалося Ярослав (03.10.2012 22:07:31)

Re: Як передати змінній символ?

truesupport написав:

MSVC чи як там компілятор від майкрософту називається

Ні, користуюсь Pelles C.

Завдання в тому, щоб контролювати невидимі символи при вводі виводі (getchar(), putchar()).
Ось приблизно як має виглядати код:

#include <stdio.h>

main()
{
    int c, tab, rev, sla;

    tab = rev = sla = 0;

    while((c = getchar()) != EOF)
    {
        if(c == '\t')
            ++tab;
        if(c != '\t')
            tab = 0;
        if(c == '\b')
            ++rev;
        if(c != '\b')
            rev = 0;
        if(c == '\\')
            ++sla;
        if(c != '\\')
            sla = 0;
        if(tab > 0)
            putchar('\t');
        if(rev > 0)
            putchar('\b');
        if(sla > 0)
            putchar('\\');
        if(tab = rev = sla = 0)
            putchar(c);

    }


}

Я виконую вправу із книги.

Прихований текст
Вправа 1-10. Напишiть програму, яка би копiювала свiй ввiд до виводу, замiню-
ючи кожну табуляцiю на ∖t, кожний реверс на ∖b i кожну зворотню похилу на ∖∖. Це
зробить табуляцiю i реверси видимими у недвозначний спосiб.

І розумію що покаравши програму, при натисканні Tab, Backspace, \ має виводитись \t, \b, \\ відповідно.
Але цей код не працює.

Білий Лунь

4 Востаннє редагувалося Ярослав (03.10.2012 23:20:03)

Re: Як передати змінній символ?

Працює все окрім реверсу.

        if(c == '\t')
            ++tab;
        if(c != '\t')
            tab = 0;
        if(c == '\b')
            ++rev;
        if(c != '\b')
            rev = 0;
        if(c == '\\')
            sla = 1;
        if(c != '\\')
            sla = 0;
        if(tab > 0)
            printf("\\t");
        if(rev > 0)
            printf("\\b");
        if(sla == 1)
            printf("\\\\");
        if(tab == rev == sla == 0)
            putchar(c);
Білий Лунь

5

Re: Як передати змінній символ?

Можна повний код бо я не до кінця розумію умову. Ну тобто розумію в загальному але є нюанси.

Це має бути щось на зразок цього

#include <stdio.h>
#include <stdlib.h>



int main()
{
    char c;
    while ( (c = getchar()) != 4)
    {
        switch (c)
        {
            
            case '\n': 
                printf_s("\\n");
                
                break;
            case '\t':
                printf_s("\\t");    
                break;
        default:
            printf_s("%c", c);
            break;
        }
    }
    system("pause");
    return EXIT_SUCCESS;
}

При ctrl+d програма завершить роботу

Подякували: Ярослав1

6

Re: Як передати змінній символ?

Ви все правильно пишете, але тут вправа на відпрацювання getchar(); putchar(); і функції if.
Ось в принципі майже робоча версія програми (або і повністю робоча):

#include <stdio.h>

main()
{
    int c, tab, rev, sla;

    tab = rev = sla = 0;

    while((c = getchar()) != EOF)
    {
        if(c == '\t')
            ++tab;
        if(c != '\t')
            tab = 0;
        if(c == '\b')
            ++rev;
        if(c != '\b')
            rev = 0;
        if(c == '\\')
            sla = 1;
        if(c != '\\')
            sla = 0;
        if(tab > 0)
            printf("\\t");
        if(rev > 0)
            printf("\\b");
        if(sla == 1)
            printf("\\\\");
        if(tab == rev == sla == 0)
            putchar(c);

    }


}

Єдине із чим я не розібрався - заміна "реверсу" на \b.
Я поекспериментував із printf, \b видаляє один символ.
Тому скажемо так:
1. Я вводжу рядок: 123abc
2. Видаляю Backspace-ом 1 символ: 123ab
3. Тисну Enter
4. Маю отримати: 123ab\b
Може я неправильно зрозумів поняття реверс?

Білий Лунь

7

Re: Як передати змінній символ?

Ви правильно зрозуміли, проте я чучуть детальніше вирішив глянути і зрозумів що це не так просто, якщо і можливо то дуже проблематично. Це звязано з тим що getchar ніколи не получає '\b'. В програму цей код просто не передається.

8

Re: Як передати змінній символ?

Спробуйте функцію getch() (header conio.h) для отримання символу \b.  Функція доступна тільки на Windows.

Подякували: truesupport, Ярослав2

9

Re: Як передати змінній символ?

дійсно працює, ніколи не знаєш коли дізнаєшся щось нове.

10

Re: Як передати змінній символ?

Replace написав:

Спробуйте функцію getch() (header conio.h) для отримання символу \b.  Функція доступна тільки на Windows.

Не працює, приведіть приклад.

Білий Лунь

11

Re: Як передати змінній символ?

getch - Reads a character directly from the console without buffer, and without echo.

#include <stdio.h>
#include <conio.h>

int main() {
   
   char ch = ' ';

   while (ch != 'q') {
     ch = getch();
     putchar(ch);
   }
   
   return 0;
}

Якось так. У мене Windows немає, не перевіряв.

12 Востаннє редагувалося Ярослав (04.10.2012 15:28:25)

Re: Як передати змінній символ?

truesupport написав:

дійсно працює, ніколи не знаєш коли дізнаєшся щось нове.

Приведіть будь ласка приклад коду, який заміняє реверс на \b.

Білий Лунь

13 Востаннє редагувалося Ярослав (11.10.2012 09:51:55)

Re: Як передати змінній символ?

Для тих, хто користується Pelles C важлива примітка:
Функцію getch(); потрібно писати із нижнім підкресленням, так: _getch();
Інакше програма працювати не буде.

Білий Лунь

14

Re: Як передати змінній символ?

#include <stdio.h>
#include <conio.h>

int main() {
   
   char ch = ' ';

   while ((ch = _getch()) != EOF){
      if(ch == '\b')
        printf("\\b");
      else
        putchar(ch);
   }
   
   return 0;
}
Білий Лунь