Как сделать выделение нужных символов в предложение на Си?
Скрин Требуется написать программу, которая:
- выводит текст на экран дисплея;
- определяет в каждом предложении текста количество символов, отличных от букв и пробела;
- по нажатию произвольной клавиши поочередно выделяет каждое предложение текста, а в выделенном предложении - поочередно все символы, отличные от букв и пробела.
Не получается сделать выделение символов по нажатию клавиши, все остальное работает.
Программа по нажатию произвольной клавиши выделяет поочередно предложения в тексте, потом выделяет символы, отличные от пробела и букв, но ставит их в конце предложения, а нужно чтобы выделяла в самом предложении тоже по нажатию любой клавиши поочередно.
#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include <windows.h>
#define MAX_LEN 1000
void clrscr();
void SetStandartScreen();
void SetTextBackground(int TextColor, int BackgroundColor);
void SearchSentence2(char *text, int from, int *begin, int *end);
void PrintNormal(char *text, int begin, int end);
void PrintColor(char *text, int begin, int end);
void PrintColorSym(char *text, int begin, int end);
int CountNonLetterSymbols(char *text, int begin, int end);
enum ConsoleColor
{
Black = 0,
Blue = 1,
Green = 2,
Cyan = 3,
Red = 4,
Magenta = 5,
Brown = 6,
LightGray = 7,
DarkGray = 8,
LightBlue = 9,
LightGreen = 10,
LightCyan = 11,
LightRed = 12,
LightMagenta = 13,
Yellow = 14,
White = 15
};
void main(void) {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int begin, end, from, symbolCount;
char text[MAX_LEN], filename[100];
printf("Ââåäèòå èìÿ ôàéëà ñ äàííûìè: ");
scanf("%s", filename);
FILE *file = fopen(filename, "r");
if (file == NULL) {
printf("Îøèáêà ïðè îòêðûòèè ôàéëà.\n");
}
fgets(text, MAX_LEN, file);
fclose(file);
from = 0;
begin = 0;
while (begin >= 0) {
SearchSentence2(text, from, &begin, &end);
int i = begin;
clrscr();
if (begin >= 0) {
PrintNormal(text, 0, begin - 1);
PrintColor(text, begin, end);
PrintColorSym(text, begin, end);
symbolCount = CountNonLetterSymbols(text, begin, end);
printf(" (%d)", symbolCount);
PrintNormal(text, end + 1, strlen(text) - 1);
from = end + 1;
getch();
}
}
};
void clrscr()
{
system("cls");
return;
};
void SetStandartScreen()
{
system("color 0F");
};
void SetTextBackground(int TextColor, int BackgroundColor)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, (WORD) ((BackgroundColor << 4) | TextColor));
return;
};
void SearchSentence2(char *text, int from, int *begin, int *end) {
int i, j, len;
len = strlen(text);
if (from < len) {
i = from;
// Ïðîïóñê íå áóêâ â íà÷àëå
while (i < len && !isalpha(text[i])) {
i++;
}
if (i == len) {
*begin = -1;
} else {
*begin = i;
*end = i;
}
while (i < len) {
if (text[i] == '!' || text[i] == '?') {
*end = i;
return;
} else if (text[i] == '.') {
*end = i;
j = i + 1;
while (j < len && !isalpha(text[j])) {
j++;
}
if (j < len && islower(text[j])) {
i = j;
continue;
} else {
return;
}
}
i++;
}
} else {
*begin = -1;
}
}
void PrintNormal(char *text, int begin, int end) {
SetTextBackground(White, Black);
for (int i = begin; i <= end; i++) {
putch(text[i]);
}
}
int CountNonLetterSymbols(char *text, int begin, int end) {
int count = 0;
for (int i = begin; i <= end; i++) {
if (!isspace(text[i]) && !isalpha(text[i])) {
count++;
}
}
return count;
}
void PrintColor(char *text, int begin, int end)
{
int i;
SetTextBackground(Black, LightGray);
for(i=begin; i<=end; i++)
putch(*(text+i));
SetTextBackground(White, Black);
return;
};
void PrintColorSym(char *text, int begin, int end)
{
int i;
SetTextBackground(Black, LightGray);
for(i=begin; i<=end; i++)
{ if (!(isspace(text[i])) && !(isalpha(text[i]))) {
SetTextBackground(Black, LightRed);
putch(*(text+i));
}
}
SetTextBackground(White, Black);
return;
};