C++程序之高亮显示C++代码

运行结果

 源码

#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <windows.h>
#include <conio.h>
#include <string>
using namespace std;//The namespace.

int top = 0;
int lines = 0;
bool inDoubleQuote;
bool inSingleQuote;
bool isPreprocessor;
bool isStringInPreprocessor;
bool isSingleLineComment;
bool isMoreLinesComment;
/*The variables.*/
char word[101];
string str[1000001];
string reservedWords[56] =
{
    "if", "else", "while", "signed", "throw", "union", "this",
    "int", "char", "double", "unsigned", "const", "goto", "virtual",
    "for", "float", "break", "auto", "class", "operator", "case",
    "do", "long", "typedef", "static", "friend", "template", "default",
    "new", "void", "register", "extern", "return", "enum", "inline",
    "try", "short", "continue", "sizeof", "switch", "private", "protected",
    "asm", "catch", "delete", "public", "volatile", "struct", "using",
    "namespace", "bool", "true", "false", "not", "and", "or"
};

bool IsReservedWord();
bool IsNumber();

int main()
{
    system("color F0");
    freopen("testIO.cpp", "r", stdin);
    string s;
    while (getline(cin, s))
    {
        str[lines] = s;
        lines++;
    }
    fclose(stdin);
    COORD COORDSIZE{ 80, (short)(lines + 1) };
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), COORDSIZE);
    isMoreLinesComment = false;
    for (int i = 0; i < lines; i++)
    {
        CONSOLE_SCREEN_BUFFER_INFO consoleScreenBufferSize;
        GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &consoleScreenBufferSize);
        if (consoleScreenBufferSize.dwSize.X < str[i].length() + 4)
        {
            COORD COORDsize2 {
            (short)(str[i].length() + 5), consoleScreenBufferSize.dwSize.Y};
            SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), COORDsize2);
        }
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
        printf("%3d ", i + 1);
        isSingleLineComment = false;
        top = 0;
        inDoubleQuote = false;
        inSingleQuote = false;
        isPreprocessor = false;
        isStringInPreprocessor = false;
        memset(word, 0, sizeof(word));
        for (int j = 0; j < str[i].length(); j++)
        {
            if (not(isSingleLineComment or isMoreLinesComment))
            {
                if (inDoubleQuote == false and inSingleQuote == false)
                {
                    if (str[i][j] == '/' and j + 1 < str[i].length() and str[i][j + 1] == '/')
                    {
                        isSingleLineComment = true;
                        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY);
                        cout << str[i][j];
                        continue;
                    }
                    else if (str[i][j] == '/' and j + 1 < str[i].length() and str[i][j + 1] == '*')
                    {
                        isMoreLinesComment = true;
                        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY);
                        cout << str[i][j];
                        continue;
                    }
                }
                if (inDoubleQuote == false and inSingleQuote == false and isPreprocessor == false)
                {
                    if ((str[i][j] >= 'a' and str[i][j] <= 'z') or (str[i][j] >= 'A' and str[i][j] <= 'Z') or (str[i][j] >= '0' and str[i][j] <= '9'))
                    {
                        top++;
                        word[top] = str[i][j];
                    }
                    else
                    {
                        if (top > 0)
                        {
                            if (IsReservedWord())
                            {
                                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_INTENSITY | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY);
                            }
                            else if (IsNumber())
                            {
                                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY);
                            }
                            else
                            {
                                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0 | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY);
                            }
                            for (int k = 0; k < top; k++)
                            {
                                cout << word[k];
                            }
                            top = 0;
                        }
                        if (str[i][j] == '\"' and inSingleQuote == false)
                        {
                            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY);
                            cout << str[i][j];
                            inDoubleQuote = !inDoubleQuote;
                        }
                        else if (str[i][j] != '#')
                        {
                            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0 | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY);
                            if (inDoubleQuote == false and str[i][j] == '\'')
                            {
                                inSingleQuote = !inSingleQuote;
                            }
                            cout << str[i][j];
                        }
                        else
                        {
                            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED);
                            cout << str[i][j];
                            isPreprocessor = true;
                        }
                    }
                }
                else if (isPreprocessor == false)
                {
                    if (str[i][j] == '\"' and inDoubleQuote == true)
                    {
                        inDoubleQuote = !inDoubleQuote;
                        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_INTENSITY | BACKGROUND_RED);
                    }
                    else if (str[i][j] == '\'' and inSingleQuote == true)
                    {
                        inSingleQuote = !inSingleQuote;
                        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0 | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY);
                    }
                    cout << str[i][j];
                }
                else
                {
                    if (not isStringInPreprocessor)
                    {
                        if (str[i][j] == '<' or str[i][j] == '\"')
                        {
                            isStringInPreprocessor = true;
                            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_INTENSITY | BACKGROUND_RED);
                        }
                        else
                        {
                            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_INTENSITY | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_INTENSITY | BACKGROUND_RED);
                        }
                        cout << str[i][j];
                    }
                    else
                    {
                        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | BACKGROUND_RED | BACKGROUND_INTENSITY | BACKGROUND_GREEN | BACKGROUND_BLUE);
                        cout << str[i][j];
                        if (str[i][j] == '>' or str[i][j] == '\"')
                        {
                            isStringInPreprocessor = false;
                        }
                    }

                }
            }
            else
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_INTENSITY | BACKGROUND_RED);
                cout << str[i][j];
                if (j > 0 and str[i][j - 1] == '*' and str[i][j] == '/')
                {
                    isMoreLinesComment = false;
                }
            }

        }
        if (top > 0)
        {
            if (IsReservedWord())
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_BLUE | FOREGROUND_INTENSITY | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY);
            }
            else if (IsNumber())
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY);
            }
            else
            {
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0 | BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY);
            }
            for (int k = 0; k < top; k++)
            {
                cout << word[k];
            }
            top = 0;
        }
        cout << endl;
    }
    _getch();
    return 0;
}

bool IsReservedWord()
{
    for (int i = 0; i < top; i++)
    {
        word[i] = word[i + 1];
    }
    word[top] = 0;
    for (int i = 0; i < 56; i++)
    {
        if (word == reservedWords[i])
        {
            return true;
        }
    }
    return false;
}

bool IsNumber()
{
    for (int i = 0; i < top; i++)
    {
        if (not(word[i] >= '0' and word[i] <= '9'))
        {
            return false;
        }
    }
    return true;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ze言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值