質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

curses

cursesは、 UNIX 系列で使用される端末制御ライブラリです。CUI アプリケーションを作成するために使用されます。表示端末は多くの制御コードをサポートしており、カーソル移動や画面のスクロール、領域消去といった一般的な操作の実行が可能です。

受付中

テキストエディタの作成で文字列データの持たせ方が知りたい

samidare_chan
samidare_chan

総合スコア278

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

curses

cursesは、 UNIX 系列で使用される端末制御ライブラリです。CUI アプリケーションを作成するために使用されます。表示端末は多くの制御コードをサポートしており、カーソル移動や画面のスクロール、領域消去といった一般的な操作の実行が可能です。

0回答

0リアクション

0クリップ

315閲覧

投稿2022/08/09 07:36

編集2022/08/09 12:47

提示コードですが改行関数と文字と文字の間に文字を挿入する関数を作成したのですがこれだと下記の問題点のよな問題が発生するのですがどういったやり方をするのが定番なのでしょうか?

参考サイト:https://www.tohoho-web.com/ex/regexp.html#:~:text=%E3%83%AA%E3%83%B3%E3%82%AF-,%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%81%A8%E3%81%AF,%E3%81%84%E3%82%8B%E3%82%82%E3%81%AE%E3%81%8C%E7%95%B0%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

問題点

このような文字列の操作をしているとカッコの自動挿入や補填やシンタックスハイライトなど実装がむずかしくなる

知りたいこと

テキストエディタの作成でどう文字列をいじればいいか知りたい

cpp

#include "MainScreen.hpp" #include <Magick++.h> #include "memory.h" #include "../../LibConsole/lib_src/Console.hpp" #include <ncurses.h> #include <iostream> #include <filesystem> #define CTRL(x) ((x) & 0x1f) #define LINE_BUFFER ((int)1000) #define byte char MainScreen::MainScreen() { setlocale(LC_ALL, ""); //日本語利用 //cbreak(); //nocbreak(); //noecho(); // echo(); GetFileData(); cursorPosition = glm::ivec2(0,0); logo = std::string(R"( ______ __ /_ __/____ __/ /_ / / / -_) \ / __/ /_/ \__/_\_\\__/ ___ __ / __/__/ (_) /____ ____ / _// _ / / __/ _ \/ __/ /___/\_,_/_/\__/\___/_/ )"); } std::string MainScreen::DragAndDrop() { std::string p = Console::InputString(); if(p.length() > 3) { p.erase(0,1); p.pop_back(); p.pop_back(); return p; } else { return std::string(""); } return std::string(""); } bool MainScreen::getExit() { return isExit; } void MainScreen::GetFileData() { std::string fileName = "Main.cpp"; FILE *fp = fopen(fileName.c_str(),"a+"); if(fp != NULL) { char str[LINE_BUFFER]; while(fgets(str,LINE_BUFFER,fp) != NULL) { file.push_back(new char[LINE_BUFFER]); //file.push_back(str); memcpy(file.back(),str,LINE_BUFFER); } } else { } for(int i = 0; i < file.size(); i++) { Console::Draw(Console::ColorCode::White,Console::ColorCode::Black,nullptr,"%s",file.at(i)); } } void MainScreen::LineSpacing(int key) { char str[LINE_BUFFER] = {'\0'}; int t = strlen(file.at(cursorPosition.y)); int len = t - cursorPosition.x; //文字列の長さ for(int i = 0; i < len; i++) { str[i] = file.at(cursorPosition.y)[cursorPosition.x + i]; } file.at(cursorPosition.y)[strlen(file.at(cursorPosition.y)) + 1] = '\0'; file.at(cursorPosition.y)[strlen(file.at(cursorPosition.y)) + 2] = '\n'; file.at(cursorPosition.y)[cursorPosition.x] = (char)key; cursorPosition.x += 1; Console::Debug::WriteLog("aaa %s\n",str); for(int i = 0; i < strlen(str); i++) { file.at(cursorPosition.y)[cursorPosition.x + i] = str[i]; } } void MainScreen::NewLine() { char str[LINE_BUFFER] = {'\0'}; int t = strlen(file.at(cursorPosition.y)); int len = t - cursorPosition.x; //文字列の長さ for(int i = 0; i < len; i++) { str[i] = file.at(cursorPosition.y)[cursorPosition.x + i]; } str[len] = '\0'; for(int i = 0; i < t; i++) { file.at(cursorPosition.y)[cursorPosition.x + i] = '\0'; } file.at(cursorPosition.y)[strlen(file.at(cursorPosition.y))] = '\n'; //改行挿入 std::vector<char*> line; for(int i = 0; i < (file.size() - cursorPosition.y); i++) { line.push_back(new char[LINE_BUFFER]); strcpy(line.back(),file.at(cursorPosition.y + i)); } int total = (file.size() - cursorPosition.y); file.push_back(new char[LINE_BUFFER]); for(int i = 0; i < line.size(); i++) { strcpy(file.at(cursorPosition.y + i + 1),line.at(i)); } for(int i = 0; i < strlen(str); i++) { file.at(cursorPosition.y + 1)[i] = str[i]; } //file.at(cursorPosition.y) = "\0"; cursorPosition.x = 0; cursorPosition.y += 1; } void MainScreen::Loop() { Console::ClearBuffer(NULL); for(int i = 0; i < file.size(); i++) { Console::Draw(Console::ColorCode::White,Console::ColorCode::Black,nullptr,"%s",file.at(i)); } move(cursorPosition.y,cursorPosition.x); int key = getch(); if(key == KEY_ESC) { isExit = true; } else if( key == KEY_DOWN) { cursorPosition.y += 1; } else if( key == KEY_UP) { cursorPosition.y += -1; } else if( key == KEY_RIGHT) { cursorPosition.x += 1; } else if( key == KEY_LEFT) { cursorPosition.x += -1; } else if( key == KEY_RETURN) { //Console::Debug::WriteLog("qqqq \n"); NewLine(); } else if( key == CTRL('x') ) { Console::Debug::WriteLog("Save\n"); } else if( (byte)(key << 4) & (byte)KEY_BACKSPACE ) { Console::Debug::WriteLog("KEY_BACKSPACE \n"); } else { //Console::Debug::WriteLog("ああああああ \n"); LineSpacing(key); } //Console::Debug::WriteLog("KEY_BACKSPACE \n"); } void MainScreen::SetFilePath(std::filesystem::path p) { for (const std::filesystem::directory_entry& x : std::filesystem::recursive_directory_iterator(p.native())) { if(std::filesystem::is_directory(x.path()) == false) { Console::Draw(Console::ColorCode::White,Console::ColorCode::Black,nullptr,"path %s\n",x.path().c_str()); filePath.push_back(std::string(x.path().c_str())); } } // Console::Draw(Console::ColorCode::White,Console::ColorCode::Black,nullptr,"path \\n"); } MainScreen::~MainScreen() { for(int i = 0; i< file.size(); i++) { free(file.at(i)); } }

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/08/11 05:42

こちらの質問が複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

episteme

2022/08/09 08:54

> テキストエディタの作り方として間違えていると思うんですが どこが/どう間違えてると思うのか、説明を求めます。
Orlofsky

2022/08/10 05:22

サクラエディタがソースコードを公開しているから参考にしては? 全ソースコード サクラエディタ本体 V2 (Unicode版) 最新ソースコード (trunk2) サクラエディタ本体 V1 (ANSI版) 最新ソースコード (trunk) https://sakura-editor.github.io/

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

curses

cursesは、 UNIX 系列で使用される端末制御ライブラリです。CUI アプリケーションを作成するために使用されます。表示端末は多くの制御コードをサポートしており、カーソル移動や画面のスクロール、領域消去といった一般的な操作の実行が可能です。