Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > [С] строки - выделение цветом символов!


Автор: 1122 12.1.2008, 22:53
Здравствуйте.
Есть задание: Дана сторока символов. Выделить все символы в этой строке другим цветом, не являющиеся буквами.
Проверку на "символьность" я знаю как сделать, а вот как выделить другим цветом, кажем красным.. не знаю. Подскажите пожалуйста.
Программу нужно написать на Си.

Автор: JackYF 12.1.2008, 23:21
Цитата(1122 @  12.1.2008,  21:53 Найти цитируемый пост)
Выделить все символы в этой строке другим цветом, не являющиеся буквами.

выводить цветом - где? в визуальном окне? в консоли? какая ОС? какой компилятор?

Автор: 1122 12.1.2008, 23:28
Компилятор Visual C++ (Visual Studio 2005)
В консоле. Вин ХР.

Автор: JackYF 12.1.2008, 23:52
Цитата(1122 @  12.1.2008,  22:28 Найти цитируемый пост)
В консоле. Вин ХР. 

Тогда курить MSDN (WinAPI) на предмет функций а-ля SetConsoleТратата.

Добавлено через 15 секунд
И найти функцию, которая позволит менять цвет.

Автор: 1122 13.1.2008, 00:26
setConsoleTextAttribute - не это случайно?)

Автор: bsa 13.1.2008, 00:40
1122, очень похоже. Тебе видней. smile 

Автор: Dov 13.1.2008, 01:40
Цитата(1122 @  12.1.2008,  23:26 Найти цитируемый пост)
setConsoleTextAttribute - не это случайно?)


1122, поскольку тебе нужно подсветить не всю строку, а отдельные символы, то лучше использовать WriteConsoleOutputAttribute, что бы у тебя была возможность переходить по координатам и, таким образом, выделять цветом отдельный символ. 

Автор: Dov 13.1.2008, 02:00
Что нибудь такое, например:
Код
#include <stdio.h>
#include <windows.h> 
#include <ctype.h>

enum COLOR {BLUE = 9, GREEN, TURQUOISE, RED, VIOLET, YELLOW};

void textcolor(int x, int y, WORD color)
{
    HANDLE stdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD  coord  = {x, y};

    WriteConsoleOutputAttribute(stdOut, &color , 1, coord, NULL);
}

int main()
{
    char* str = "<<< Happy new year 2008! >>>";

    printf("Result:\n%s\n", str);

    for(int i = 0; str[i]; i++)
        if(!isalpha(str[i]))
           textcolor(i, 1, RED);

    return 0;
}

Автор: 1122 13.1.2008, 02:13
Спасибо!!!
Dov, а вы не могли бы поподробнее рассказать про аргументы WriteConsoleOutputAttribute(stdOut, &color , 1, coord, NULL);
Что они значат. особенно 3 последних =)

и вот это что?
enum COLOR {BLUE = 9, GREEN, TURQUOISE, RED, VIOLET, YELLOW};
это типа доступные цвета?)

P.s. Еще раз большое спасибо за готовый код!!!

Автор: Dov 13.1.2008, 17:33
Цитата(1122 @  13.1.2008,  01:13 Найти цитируемый пост)
Что они значат. особенно 3 последних

Код
BOOL WriteConsoleOutputAttribute(
    HANDLE hConsoleOutput,         // дескриптор экранного буфера
    CONST WORD * lpAttribute,      // атрибуты записи
    DWORD nLength,                 // число ячеек, в которые атрибуты должны быть скопированы
    COORD dwWriteCoord,            // координаты первой ячейки
    LPDWORD lpNumberOfAttrsWritten // число фактически записанных ячеек
);

1122, вообще-то эту информацию лучше смотреть в MSDN.  
 
Цитата(1122 @  13.1.2008,  01:13 Найти цитируемый пост)
и вот это что?enum COLOR {BLUE = 9, GREEN, TURQUOISE, RED, VIOLET, YELLOW};это типа доступные цвета?)
  smile 
Да, это набор констант для выбора цвета, но ты можешь использовать стандартные:
Код

FOREGROUND_BLUE
FOREGROUND_GREEN
FOREGROUND_RED
FOREGROUND_INTENSITY 
BACKGROUND_BLUE
BACKGROUND_GREEN
BACKGROUND_RED
BACKGROUND_INTENSITY
 
Можно их комбинировать в разных сочетаниях. Например, нижеследующая комбинация 
Код

FOREGROUND_BLUE | FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_INTENSITY

даст тебе синий текст на красном фоне.



Автор: 1122 13.1.2008, 18:26
Dov, еще раз огромное спасибо!

Автор: JackYF 14.1.2008, 16:43
Цитата(1122 @  13.1.2008,  17:26 Найти цитируемый пост)
Dov, еще раз огромное спасибо! 

вопрос решён? если да, то помечай тему решённой.

Автор: 1122 15.1.2008, 22:39
да. Вопрос решен. Извините. Не знал, что такие правила.


M
JackYF
Это не правила, это рекомендации :)
В следующий раз решенную тему помечай галочкой (сверху или при ответе в тему)
В этот раз пометил сам.

Автор: Siscipsak 1.9.2022, 09:25
Модератор: Сообщение скрыто.

Автор: DrawSwade 13.9.2022, 17:36
Модератор: Сообщение скрыто.

Автор: aqually 13.10.2022, 11:34
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)