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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

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

Q&A

解決済

4回答

7603閲覧

文字列の任意の場所で改行を入れたい

daiking

総合スコア19

C++

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

0グッド

0クリップ

投稿2020/01/28 02:58

標準入力から受け取った文字列をstringにいれてその文字列の特定の場所で改行を入れたいです。
また、受け取る文字列の大きさはその時々で変わります。

例えば48文字の文字列を受け取り、6文字ごとに改行を入れたいとします。

c++

1#include <iostream> 2#include <string> 3#include <stdio.h> 4 5using namespace std; 6int main(void) { 7 8 9 int N, M, L; 10 11 12 13 cin >> N >> M >> L; 14 cout << N << M << L << endl; 15 string str; 16 string strCopy; 17 string strDuplicate; 18 19 for(int i=0;i<N;++i){ 20 cin>>str; 21 strCopy += str; 22 } 23 auto first = strCopy.begin(); 24 // Lには6が入っている。 25 strCopy.insert(first + L, '\n'); 26 27 28 cout<<strCopy; 29 30}

自分はこのようにinsertでL文字目に改行を入れようと試みました。もちろん、これだと一回しか改行がされないため最初の行は6文字になるのですが、そのあとは改行されません。ここまで自力でできたのですがここからどうやって6文字ごとに改行していけばよいかわかりません。
for文で回してもうまくいきません。
どのように考えていくか教えていただきたいです。

↓が今の状態です。これを6文字ごとに改行していきたいです。

hhhhhh
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

「L文字ごとに'\n'を挿入」を愚直に実装

C++

1#include <iostream> 2#include <algorithm> 3#include <string> 4 5int main() { 6 using namespace std; 7 8 string input = "abcdefghijklmnopqrstuvwxyz"; 9 string output; 10 11 const int L = 6; 12 int count = 0; 13 for ( char ch : input ) { 14 output.push_back(ch); 15 if ( ++count == L ) { 16 output.push_back('\n'); 17 count = 0; 18 } 19 } 20 cout << output << endl; 21}

投稿2020/01/29 00:22

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

for文で回してもうまくいきません。

恐らく、イテレータ(ソース中のfirst)をfor文で回したのではないでしょうか?
insert()した時、確保しているメモリが不足した場合には、メモリ・ブロックが再確保されます。
その時にイテレータが「あらぬ所=開放されたところ」を指しますので、以降未定義動作となります。

strCopyについてfor文で回し、strDuplicateへ文字列を6文字づつ追加する度に改行コードを追加すれば良いと思います。これによりstrCopyを変更しないで済むので、イテレータが無効になることがありません。

投稿2020/01/28 06:32

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

48文字の場合、最後の 6文字の後にも改行を入れるのでしょうか?
47文字の場合、最後の 5文字の後にも改行を入れるのでしょうか?
質問のコードの N や M は何を表しているのでしょうか?

次のコードを参考に書き直したコードを質問に追加してもらえませんか?

C++

1#include <iostream> 2#include <string> 3using namespace std; 4 5int main() 6{ 7 string s1 = "abcdefghijklmnopqrstuvwxyz"; 8 string s2; 9 for (int i = 0, k = 0; i < s1.size(); i++) { 10 s2 += s1[i]; 11 if (++k == 6) s2 += '\n', k = 0; 12 } 13 cout << s2; 14}

文字列の連結が非効率だというなら、ostringstream を使うこともできます。

投稿2020/01/28 05:03

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daiking

2020/01/28 05:43

回答ありがとうございます。N,M,Lは標準入力の一行目で入力される数字です。 例えば6,8,6と入力されると6行8列が入力されそれを6列に直せということになります。 上のコードでやりたいことはできたのですが、変数kが気になりました。変数Kはi++のようにしなくても勝手に増えていくものなんですか?Kが6の時に改行を加えているということはわかったのですがKはIと同じように増えていくのですか? 質問多くてすみません。
kazuma-s

2020/01/28 06:11

6行8列の 48文字を 8行6列にしたいということですか? 5行8列だったら、最後の行は 4列ですか? やりたいことができたというコードを見せてください。 k の値は ++k により増えていきます。
guest

0

strCopyに入力が全部ひとつながりになっているのであれば,
strCopyの要素についてループして1文字ずつ表示していき,
その際に6文字毎に改行すればよいのではないでしょうか.
(「1文字ずつ」が非効率だと思うなら,意味的に同様な処理実装にすればよい)


例えば,こんなので良いのでは.

C++

1//※strCopy に,すべての入力文字列がひとつながりでつながっている. 2const std::string strCopy = "123456abcdefABCDEFXYZ"; 3const size_t N = strCopy.size(); 4 5size_t Pos=0; 6while( Pos+6 < N ) 7{//6文字毎に改行して表示 8 std::cout << strCopy.substr( Pos, 6 ) << std::endl; 9 Pos+=6; 10} 11//残りがある場合に表示する 12size_t Rest = N-Pos; 13if( Rest ){ std::cout << strCopy.substr( Pos, Rest ) << std::endl; }

投稿2020/01/28 03:09

編集2020/01/28 06:00
fana

総合スコア11658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daiking

2020/01/28 03:17

コメントありがとうございます。 最初そのような実装をしたのですがランタイムエラーになってしまいダメでした。 (「1文字ずつ」が非効率だと思うなら,意味的に同様な処理実装にすればよい) これを実装したいと思うのですが具体的にどのようにすれば良いかわかりません。お手数ですがどのようにこれを実装するのでしょうか? 自分的に一文字ずつしか代入できないと思っているのですが。
fana

2020/01/28 03:25

「代入」というのが何を指しているのかわかりませんが,std::stringなら適当にsubstr()とか使えばよいのでは.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問