C++でソースコードを読みやすく整形・再配置する方法
文字列型の変数 str にソースコードを格納し、その文字列の長さを計算して関数に渡します。この記事の課題は、与えられたソースコードを整形(再配置)し、適切な改行を加えた読みやすい形式で結果を出力することです。
入出力シナリオの確認
入力 − string str =
"#include <bits/stdc++.h>
using namespace std;
int main()"
"{ int sum, first, second; sum = first + second; printf(\"%d\", c);"
" return 0;}"
出力 −
#include <bits/stdc++.h>
using namespace std;
int main(){
int sum, first, second;
sum = first + second;
printf("%d", c);
return 0;
}
入力 − string str =
"#include<bits/stdc++.h>
using namespace std;
int main()"
"{ printf(\"%d\", c);"
" return 0;}"
出力 −
#include<bits/stdc++.h>
using namespace std;
int main(){
printf("%d", c);
return 0;
}
プログラムで使用するアプローチ
文字列型の変数 str を入力として受け取り、文字列のサイズを計算して length という名前の変数に格納します。
データを関数 Rearrangement(str, length) に渡します。
関数 Rearrangement(arr, length) の内部では以下の処理を行います。
文字列型変数 str_1、および整数型変数として Parenthesis を 0、Braces を 0、count を 0、i を 0、j を 0 に初期化して宣言します。
do-WHILE ループを開始します。ループ内では、まず str[i] が '#'、'<'、'>'、';'、'}'、'{'、'('、')' のいずれかであるかを判定します。str[i] が '{' であれば Braces を 1 増やします。
str[i] が '}' であれば Braces を 1 減らします。
str[i] が '<' かつ Parenthesis が 0 であれば、count を 1 増やします。
str[i] が '>' かつ Parenthesis が 0 であれば、count を 1 減らします。
str[i] が '(' であれば、count を 0 にリセットし、Parenthesis を 1 増やします。
str[i] が ')' であれば、Parenthesis を 1 減らします。
Parenthesis が 0 より大きい場合は、str_1 = str_1 + str[i] とします。そうでない場合、str[i] が ')' であれば str_1 = str_1 + str[i] とします。
ELSE IF:str[i] が '{' または '}' であれば、str_1 に '\n' を追加し、続けて str[i] を追加し、さらに '\n' を追加します。これにより波括弧の前後で改行されます。
ELSE IF:count が 0 より大きい場合は、str_1 = str_1 + str[i] とします(include ヘッダの '<>' 内などは改行しないためです)。
ELSE IF:str[i] が '#' であれば、str_1 に '\n' を追加してから str[i] を追加します(プリプロセッサ行の先頭で改行するためです)。
ELSE:str_1 = str_1 + str[i] とし、その後に '\n' を追加します(文の終わりなどで改行するためです)。
上記の特殊文字に該当しない場合は、str_1 = str_1 + str[i] とし、i を 1 増やします。
str_1 に '\0' を追加します。
i を 0 から str_1 の長さ未満まで FOR ループで回し、ループ内で str_1[i] を出力します。
最後に結果を出力します。
実装例
#include <bits/stdc++.h>
using namespace std;
void Rearrangement(string str, int length){
string str_1;
int Parenthesis = 0;
int Braces = 0;
int count = 0;
int i = 0;
int j = 0;
do{
if(str[i] == '#' || str[i] == '<' || str[i] == '>' || str[i] == ';' || str[i] == '}' || str[i] == '{' || str[i] == '(' || str[i] == ')'){
if(str[i] == '{'){
Braces++;
}
if(str[i] == '}'){
Braces--;
}
if(str[i] == '<' && Parenthesis == 0){
count++;
}
if(str[i] == '>' && Parenthesis == 0){
count--;
}
if(str[i] == '('){
count = 0;
Parenthesis++;
}
if(str[i] == ')'){
Parenthesis--;
}
if(Parenthesis > 0){
str_1 = str_1 + str[i];
}
else{
if(str[i] == ')'){
str_1 = str_1 + str[i];
}
else if(str[i] == '{' || str[i] == '}'){
str_1 = str_1 + '\n';
str_1 = str_1 + str[i];
str_1 = str_1 + '\n';
}
else if(count > 0){
str_1 = str_1 + str[i];
}
else if(str[i] == '#'){
str_1 = str_1 + '\n';
str_1 = str_1 + str[i];
}
else{
str_1 = str_1 + str[i];
str_1 = str_1 + '\n';
}
}
}
else{
str_1 = str_1 + str[i];
}
i++;
}while (i < length);
str_1 = str_1 + '\0';
for(i = 0; i < str_1.length(); i++){
cout<< str_1[i];
}
}
int main(){
string str = "#include <bits/stdc++.h>using namespace std;int main()"
"{ int sum, first, second; sum = first + second; printf(\"%d\", c);"
" return 0;}";
int length = str.length();
Rearrangement(str, length);
return 0;
}
出力結果
上記のコードを実行すると、次のような出力が生成されます。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int sum, first, second;
sum = first + second;
printf("%d", c);
return 0;
}
このように、括弧やセミコロンなどの特殊文字を検出しながら文字列を走査し、適切な位置に改行を挿入することで、1 行に圧縮されたソースコードを自動的に整形できます。インデントの深さまで考慮した本格的なフォーマッタを作る場合は、Braces カウンタを利用してスペースを付与する処理を追加するとよいでしょう。
-
C++で数値の各桁の合計を計算するプログラム
ここでは、C++言語を使用して入力された整数の各桁の合計を計算する方法を紹介します。剰余演算子と整数除算を組み合わせたシンプルなアルゴリズムで実装できます。 プログラム例 #include<iostream> using namespace std; int main() { int x, s = 0; cout << Enter the number : ; cin >> x; while (x != 0) {
-
おすすめのC++コードフォーマッタ/ビューティファイア徹底解説
ソースコードを美しく整形し、適切なインデントを自動で整えてくれるC++コードフォーマッタ(ビューティファイア)は、実にたくさんの種類が存在します。コードの可読性を向上させ、チーム開発でのスタイル統一にも役立つこれらのツールは、C++プログラマーにとって欠かせない存在といえるでしょう。本記事では、代表的なC++コードフォーマッタ/ビューティファイアを、ローカル環境向けとオンラインサービス向けに分けてご紹介します。ローカルで使えるC++コードフォーマッタ/ビューティファイアツール名概要Astyleソースコードフォーマッタです。C++やJavaをはじめ、複数のプログラミング言語に対応しています。最新