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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

1259閲覧

C言語 入力された文字を改行する作成について

matsumatsu1022

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2024/05/21 14:12

編集2024/05/22 05:53

実現したいこと

ステップ1;C言語で入力に含まれる改行は無視し、決まった文字数ご とに改行を入れて整形する
ステップ2; 日本語の漢字や仮名とASCIl文字の幅を 2 : 1 になるようにする(全角と半角)。
ステップ3; 行頭に「。」や「、」などが来ないように、改行位置を調整する。
で、ステップ3までを終わらしたいです。

発生している問題・分からないこと

ステップ1の段階で標準入力と標準出力のコードの書き方から困っています。
unicodeからUTF8に変換する?認識でヘッダファイルと変換するプログラムは完成しています。
ヘッダファイルのコードはこれです。
#ifndef UTF8_IO_H
#define UTF8_IO_H

#include <stdio.h>
#include <stdint.h>

// Unicodeの符号点を格納するための型
typedef uint32_t unicode;

#define UTF8NULL 0

// ストリームinpからUTF8のバイト列を読み、符号点を1つ返す。
// EOFまたはエラーの場合、UTF8NULLを返す。
unicode getCode(FILE *inp);

// UTF8の符号点codeをUTF8に変換してストリームoutpに書き出す
void putCode(unicode code, FILE *outp);

#endif /* UTF8_IO_H */

該当のソースコード

C

1#include "UTF8io.h" 2 3int main(int argc, char *argv[]) { 4 5 unicode input; //unicodeを読み込む。 6 7 for ( ; ; ) { //1文字ずつカウントしていく。 8 9 unicode getCode (FILE *stdin); 10 if ( UTF8NULL ) break;//最後に達したら終わる。 11 putCode (input , stdout);//出力したい 12 } 13 14 return 0; 15} 16 17

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

友人にヒントを教えてもらい実装しましたが解決できませんでした。標準出力のstdoutみたいに標準入力はstdinなのと、これだとinputになにも入れずにputCodeに渡している、stdinでsample.txtをターミナルの入力からもってこれると助言はもらいました。

補足

特になし

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

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

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

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

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

jimbe

2024/05/21 16:26 編集

関数の定義をそのまま書くのが c 言語での関数の使い方だったでしょうか? 定義にコメントとして書いてある >ストリームinpからUTF8のバイト列を読み、符号点を1つ返す。 > EOFまたはエラーの場合、UTF8NULLを返す。 というのが使い方ですので、内容を理解して記述する必要があるでしょう。 このような問題をされている以上、そのような学習の機会があったのではないでしょうか。 なお、 putCode のコメント > UTF8の符号点codeをUTF8に変換してストリームoutpに書き出す は正しくないでしょう。最初の「UTF8の」は要らないと思います。
fana

2024/05/22 02:06 編集

> 解決できませんでした 話が不明瞭です. 実際にどのような問題が生じているのですか? 行き詰っている事柄というのは,「UTFがどうのこうの」とかいう話とは全く関係無くて, 単に「C言語で関数を呼び出すコードってどう書くの? コンパイル通らないんですけど??」みたいな所なのですか? あるいは「コンパイルは通るけど結果が変だ」みたいな話ですか? その他ですか?
ikedas

2024/05/22 04:06 編集

> 関数の定義をそのまま書く getCode() 等は実装コードの掲載を省略してプロトタイプのみ示しているものでしょう。 しかし、ステップ1で行き詰まっている方がUTF-8をユニコードスカラ値にデコードする関数を実装できたというのも不思議です。また、ステップ2、ステップ3についてははるかに高度な内容ですし、考慮事項もたくさんあります (たとえば「全角」「半角」の区別ひとつとっても簡単なことではありません)。全く別種の難しさがあります。 学校の授業などの課題とも思えませんし、どういう経緯でこの問題を解くことになったのでしょうか。
jimbe

2024/05/22 04:49

>unicodeからUTF8に変換する?認識 辺りからご自身でも仕様の理解が怪しいと思われているようですので、 UTF8io.h やその実装は「(出題者か誰かが作ったものが?)完成しているからこれを使ってください」と言って提供されたという意味で「完成しています」と表現されている感じがします。
matsumatsu1022

2024/05/22 05:51

コメントありがとうございます。UTF8io.hの実装は提供者からいただいています。その意味での「完成しています」です。コードについては現在友人の協力のもと進めています。
hiroki-o

2024/05/22 09:20

ステップ2は、表示に使用するフォントの都合なので、C言語から操作できないと思います。 matsumatsu1022さん、たくさんコメントが付いていますが、あと質問は何ですか?
jimbe

2024/05/22 10:20

step2 の "幅" は実際の表示では無く "決まった文字数" までカウントするときに (sjis の"全角"/"半角"の時のように) 日本語の漢字や仮名を 2 文字、ASCIl文字を 1 文字としてカウントしろということでは。
fana

2024/05/22 11:44

なんかコメントや回答がステップ2以降の話に入り始めてる感があるけど, この質問は 「ステップ1で困っている」という点が解決すればそれで閉じる想定のものなのか? それともステップ3まで全部完了するまで続けるつもりなのか? …っていう. (前者なのかと思ってた)
jimbe

2024/05/22 11:54

先走りました、すいません。
ikedas

2024/05/22 13:00

んにゃ。私はステップ0 (そもそも入出力のためのコーディングがわからない) に付き合う気はさらさらないので、このまま突っ走りますよ! (質問者さんのサポートするご友人がいるらしいので、その方への情報提供をする方向での回答を考えているのです)
ikedas

2024/05/24 04:43

まだ回答を書いてる途中なのに終了してしまった。 とにかく、私の回答は、質問者さんに今回のテーマを与えた人に読んでもらってください。参考になれば幸いです。 あと、コーディングに関する質問については、失礼ながらまだ当サイトのようなところで質問できるレベルでさえないと思います。質問したいことがあれば、上のあなたにテーマを与えた人、あなたを手伝ってくれている人に聞いてください。 その人に自分の親を殺されたとか、自分が買ってきて冷蔵庫に入れておいたアイスを食われたとかいうのなら絶対に質問したくないというのも仕方ないです。しかしそういう事情がないのなら、一番身近な人に質問するのが最もよく質問の意図を汲み取ってもらえて適切な答えをもらえるはずです。
guest

回答4

0

ベストアンサー

質問で提示されたコードのコメントから、外部関数 getCode()、putCode() の仕様はわかりました。
getCode()で入力ファイルハンドルからUTF-8の1文字分を読み込んでデコードし、putCode()でUTF-8にエンコードして出力ファイルハンドルに書き込むのですから、単純に考えるとコードは次のようなものになることでしょう。

C

1#include <stdio.h> 2#include "UTF8io.h" 3 4int main(int argc, char *argv[]) { 5 unicode input; 6 7 while ((input = getCode(stdin)) != UTF8NUL) { // EOFかエラーになるまで1文字ずつ読む 8 if (読んだ文字を無視したい) 9 continue; 10 11 if (読んだ文字の直前で改行したい) 12 putCode(0x000A, stdout); 13 14 putCode(input, stdout); // 読んだ文字を出力 15 16 if (読んだ文字の直後で改行したい) 17 putCode(0x000A, stdout); 18 } 19 20 return 0; 21}

それぞれのif文の括弧に入る条件が実際にどんなコードになるかはご自分でお考えください。

しかし、これだけでは質問で挙げられているそれぞれの「STEP」を実現できません。以下、各STEPで検討すべき事項について、気づいた点を述べます。

#0 前提

  • レパートリの選定
    ユニコードに収載された全ての文字を対象にすることは現実的ではありませんので、ここでは日本語の文書に現れる文字を処理の前提とすることにします。このような文字集合の公的規格としてはJIS X 0213があります。以降の説明では扱う文字の範囲をこれに準拠します。
    リンク先を見てわかるとおり、「日本語の文書」には伝統的な日本語の文字 (平仮名、片仮名、漢字) 以外にもラテン文字、ギリシャ文字、キリル文字、アイヌ語用片仮名、発音記号、その他のさまざまな記号などが含まれます。

  • 改行の扱い
    入力されるテキストによって、改行のコードが "\n""\r\n""\r" などである可能性があります。したがってなんらかの方法で改行の正規化が必要です (何らかの前処理をしてもいいでしょうし、テキストを読み込むコードの中で行ってもいいでしょう)。以降の説明では入力テキストの改行はUnixの標準的な改行コード "\n" に正規化ずみであるとします。

#1 入力に含まれる改行は無視 / 決まった文字数ご とに改行を入れて整形

これは上のコードで可能ですね。改行文字 U+000A ("\n") を読み込んだら無視すればいいです。

しかし、後述するように「欧文の単語を分割しない」という処理を想定するなら、逆に入力されるデータでは欧文の単語同士の間に改行が入っている可能性を考える必要があるのではないでしょうか。例 (こちらより):

このように母音をまったく含まないチェコ語の文の例としては他にもVlk zmrzl, zhltl hrst zrn(凍った狼が一掴みの穀物を飲み込む)など がある。

「Vlk」と「zmrzl」は別の単語ですから、単に改行を無視するのではなくU+0020 (空白) に置き換えるべきでしょう。いっぽう「ど」と「が」の間の改行は無視しなければなりません。

決まった文字数ごとに改行を入れるには、読み込んだ文字数によって改行を入れればよい わけではありません。複数のユニコード文字で文字が構成される場合があります。たとえば「チタタㇷ゚」の「ㇷ゚」は U+31F7 U+309Aという2つのユニコード文字の組み合わせでひとつの文字になっています。つまりこの語はユニコード文字としては5文字ですが、文字数を数えると4文字です。
U+309Aは先行する文字に半濁点をつける結合文字 (単独では使われず必ず他の文字の後につくユニコード文字) です。JIS X 0213に収載されている文字に使われる結合文字 としてはこのほかにU+0300 (鈍アクセントをつける) やU+0301 (鋭アクセントをつける) があります。 でこれ以外のものは U+0300 〜 U+0361 の範囲にありますから、これらのコード範囲にあるものは結合文字として処理していいでしょう。〔2024-05-24訂正〕

#2 文字幅を 2 : 1 (全角と半角) に

これは、STEP 1のように文字数で改行位置を決めるのではなく、文字の幅を基準にして一定幅で改行するようにするということですね。個々の文字の文字幅の情報が与えられたとしてどのようなコードを書けばいいかは、ご自分で考えてください。

全角と半角の区別は歴史的な事情によるもので、全ての文字がこの区別を持っているわけではないのですが、大まかに言うとASCII文字など欧文の文字・記号は半角、和文のそれは全角とされ、違う幅で表示されます。ユニコードではこの幅に関連して全ての文字を6種類に分類しています (「東アジアの文字幅」を参照)。
全角と半角を区別して処理する場合、これらのうち特性F (全角) とW (広) は全角として2桁の幅、特性H (半角)、Na (狭)、N (中立) を半角として1桁の幅とすればよいでしょう。

やっかいなのが特性A (曖昧) に分類される文字で、欧文では全角ではない (欧文にはもともと全角の文字はないので) のに、日本語など東アジアの言語の等幅フォントではしばしば全角で作られてきたものです。そのため表示環境によって全角に見えたり半角に見えたりすることがあります。たとえば次のようなものです。

  • ギリシャ文字やキリル文字。テキスト中にギリシャ語やロシア語などの単語が出てくるのなら全角で表示するのは好ましくないですが、そのように表示されている例もよく見かけます。
  • 6/9形の引用符 “……” (U+201C, U+201D)、‘……’ (U+2018, U+2019) も悩むところです。日本語の等幅フォントなどでは全角の文字として表示されますが、欧文ではそうではありません。形も微妙に変わります (全角のときは左や右に空きが取られ、引用符が字面の端に寄った形になります)。

これら特性Aの文字は実際の表示環境に合わせて (想定環境を定められない場合は何らかの基準を設けて) 全角か半角かに決める必要があります。

それぞれのユニコード文字に割り当てられた特性値の情報はこちらからダウンロードできます (テキストファイル、約200kB。全てのユニコード文字についての情報なのでJIS X 0213に収載されていない文字も含みます)。

#3 行頭に「。」や「、」などが来ないように、改行位置を調整

行頭禁則や行末禁則の処理ですね。

一般に閉じ括弧、句読点、音引き、小書き仮名などは行頭に来ないようにします。つまりこれらの直前では改行して行を分割することは禁止されます。同様に開き括弧などは行末に来ないようにします。つまりこれらの直後では改行して行を分割することは禁止されます。さらに、分割禁止のルールとしては、欧文の単語の途中では改行してはならないといったものもあります。

これらを考えてみると、例えば次のような場合 (かなりわざとらしい例ですが)

(「『trueだぁーっ!!』。」。)?

では、「e」と「だ」の間でしか行を分割できません。他の箇所には改行を入れられないことになります。

ここへ来て、冒頭に示した一文字ずつ読んですぐ出力するコードでは処理がうまくいかなくなります。読んだものをある程度メモリ上のバッファに置いておき、改行できる位置が見つかったら出力するようなコードが必要です。——ただ、質問者さんがそのようなコードを書き始めるのはどんなに早くても数ヶ月は先の話でしょうから、今からコード例などを示して予断を与えるようなことは控えます。

少しだけ説明します。#1 で挙げたテキストを例にすると、改行可能な位置は次のようになります。

こ|の|よ|う|に|母|音|を|まっ|た|く|含|ま|な|い|チェ|コ|語|の|文|の|例|と|し|て|は|他|に|も|Vlk‖zmrzl,‖zhltl‖hrst‖zrn|(凍っ|た|狼|が|一|掴|み|の|穀|物|を|飲|み|込|む)|な|ど|が|あ|る。

「|」と「‖」で改行可能な位置を示しました。「‖」の箇所はU+0020 (空白) があるため、ここで改行した場合は1桁減ります。このようにして改行可能な位置を見つけていき、適切な箇所で改行します。

日本語の禁則処理の詳細については下記を参照してください。

以下は余談です。

  • #1 で、欧文の単語の間の改行について「単に改行を無視するのではなくU+0020 (空白) に置き換えるべきでしょう」と述べました。どういう場合に改行を空白に置き換えるべきかは、分割可否ルールから導くことができます。
    つまり、「Vlk」と「zmrzl」の間にもともと何もなかったのであればkとzの間での分割は禁止されるので、改行することはできなかったはずです。したがって分割禁止にならないように改行に代えて空白を挿入する必要があります。いっぽう「ど」と「が」の間は分割禁止ではないので、単に改行を無視できます。

  • #0 のウィキペディアの記事でも、上のJLREQでも、文字の一覧にいわゆる「全角英数」や「半角仮名」が挙げられていないのに気づかれたかもしれません。JIS X 0213のような文字コード規格ではこれらのものは過去の遺産であり、今後は基本的に使うべきではないという立場です (完全に禁止しているわけではないですが)。そのため一覧に挙がっていません。

    • 全角形の文字の分割可否ルールについては、次のいずれかの方法があります。
      a. 対応するASCIIの文字と同じルールにする。
      b. 漢字などのいつでも前後どちらでも分割可能な文字と同じルールにする。
    • 半角形の文字の分割可否ルールについては、次のいずれかの方法があります。
      a. 対応する「全角」の片仮名や句読点と同じルールにする。
      b. 欧文の文字と同様、互いに分離禁止にする。
      ただしいずれの場合も、U+FF9E「゙」(半角濁点) とU+FF9F「゚」(半角半濁点) の直前は分割禁止とします。

雑多な補足

  • 結合文字の処理について。結合文字は必ず他の文字の後につきますが、これがついても元の文字の文字幅が増えることはありませんし、分割可否ルールは変化しません。一方で結合文字と先行する文字との間は絶対に分割禁止です。つまり、入力に結合文字が現れたらそのまま出力しなければなりませんが、文字幅の計算や改行の可否判断はあたかもその結合文字が存在しないかのようにして行います (ちなみに結合文字はひとつの文字に複数つく場合もあります)。
  • ユニコードではひとつの文字を何通りかの方法で表せる場合があるので、一つの表しかたに揃える「正規化」という前処理を行うことが推奨されます。よく使われる正規化の形式は正規化形式C (NFC) というものです。「Unicode正規化」を参照。
  • 禁則処理への対応として「ぶら下げ組み」が行われることがあります。JLREQではこれについて触れていませんが、おそらく商業出版の書籍で縦書きのもの (漫画は除く) のほとんどがぶら下げ組みを採用しています。ご質問で想定されているようなプレインテキストでの改行処理でも、行末禁則の効果で行の右端が削れてしまうことをぶら下げ組みによって減らせるので、検討してみてもよいかもしれません。

最後に、ご質問の課題はおそらく自分で実装することに意義があるのだと思われますのでこれは関係ないかと思いますが、以上説明してきたようなさまざまな処理 (文字幅の特性の判別、改行処理、正規化処理など) を行うライブラリパッケージもあります。ICUはよく使われます。

投稿2024/05/22 09:31

編集2024/05/24 09:06
ikedas

総合スコア4441

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

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

0

ステップ1の段階で標準入力と標準出力のコードの書き方から困っています。

直面している問題が何なのかがよくわかりませんが,あなた自身が問題を一般的な話として切り出して質問する(すなわち,UTF8io.h なる物とは無関係な話として質問する)必要があると考えます.
なぜならば,外野たる我々からすると, UTF8io.h に依存した何かしらのコードのようなものを 想像で 書いてみせたところで,その妥当性(本当に想定通りに正しく動くか否か)の確認は不可能だからです.

例えば,↓は質問文内に提示されているコードを私が なんとなく想像で 修正してみたつもりの物ですが,私には動作確認もできませんから「こうです!」とか言えないわけです.

C

1#include "UTF8io.h" 2 3int main(int argc, char *argv[]) 4{ 5 unicode input; 6 for ( ; ; ) 7 {//よくわかんねぇけど,こんな感じだったり?みたいな. 8 input = getCode( stdin ); //maybe... 9 if( input == UTF8NULL )break; //Perhaps... 10 putCode( input, stdout ); 11 } 12 return 0; 13}

……なわけなので,前記したように問題を一般的な話にできないのであれば,ヒントやら助言をくれている人をもう少し頼ってみるとか,あるいは UTF8io.h なる物の出所に「使い方のサンプル」くらいは提供を求めてみるとか,そういう方向を考えてみるのが良いのではないでしょうか.

投稿2024/05/22 05:34

編集2024/05/22 05:35
fana

総合スコア11893

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

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

0

ステップ1;C言語で入力に含まれる改行は無視し、決まった文字数ご とに改行を入れて整形する

これは文字列内の改行コードを検索し、改行コードを見つけたら改行コード以降の文字列を左に詰めてあげる必要があります。
そして決まった文字数ごとに改行コードを挿入したらそれ以降の文字列を右にずらす必要があります。

投稿2024/05/22 03:14

ddweothd

総合スコア6

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

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

jimbe

2024/05/22 04:37

"無視" の意味が違う可能性もありますね。 仰っているのは「既存の改行を消して新たに付け直す」という "無視" ですが、「既存の改行がどうであるかは気にせず(=1文字として扱って?)指定した改行をする」という "無視" かもしれません。 既存の改行を消す場合でも処理方法によっては1文字ずつのループで可能だったりしますので、「左に詰め」「ずらす必要がある」かはまだ明確では無いと思いますが、如何でしょうか。
ddweothd

2024/05/22 04:44

strcpyやmemcpyでずらせると思います。
matsumatsu1022

2024/05/22 05:51

回答ありがとうございます。 ベストアンサーは別の方を選ばせていただきましたが、こちらの回答も非常に参考になりました。
jimbe

2024/05/22 07:45

>strcpyやmemcpyで すいません、「1文字ずつのループで可能」を「1文字ずつのループでずらす」と感じられてしまったでしょうか。 例えば改行を無くす場合は 1. 以下無限ループ 1-1. "文字"を取得 1-2. "文字"がEOFならループを抜ける 1-3. "文字"が改行ならループへ戻る 1-4. "文字"を表示 で(表示からは)改行が無くなります。ずらす処理はありません。 さらに(改行以外の)文字数が”決まった文字数”で改行を入れるなら 1. "文字数"を0にする 2. 以下無限ループ 2-1. "文字"を取得 2-2. "文字"がEOFならループを抜ける 2-3. "文字"が改行ならループへ戻る 2-4. "文字"を表示 2-5. "文字数"を1増やす 2-6. "文字数"が”決まった文字数”になったら以下 2-6-1. 改行を表示 2-6-2. "文字数"を0にする でも出来ますが、ずらす処理はありません。 このような処理で OK という想定でした。
dodox86

2024/05/22 11:58 編集

※質問も回答もコメントも色々混乱しているようですが、本コメントは、本回答と以下コメントを読んだ方向けのものです。 > ddweothd 2024/05/22 13:44 > > strcpyやmemcpyでずらせると思います。 strcpyやmemcpyで格納元と格納先でコピーサイズを考えたときに領域が重なっている場合の動作はC言語の標準関数の仕様上、動作未定義ですので使ってはいけません。 https://en.cppreference.com/w/c/string/byte/strcpy https://en.cppreference.com/w/c/string/byte/memcpy あくまで「左に詰め」「ずらす必要がある」場合に標準関数を使うのであれば、memmoveの類ですね。 ある程度以上の公式のリファレンスであれば、領域のオーバーラップに関しても触れられているようです。 [一部修正済み]
guest

0

ステップ1の段階で標準入力と標準出力のコードの書き方から困っています。

「日本語文字列を UTF-8 でエンコードしたバイト列を標準入力から読み込み,STEP 1,2,3 に対応して標準出力に書き出す」処理をヘッダファイル(UTF8io.h)と変換プログラム(UTF8io.c?)を用いて実現するのが目標と思います。

とは言え,上記の困っている内容を鑑みると,UTF8io.h 等は使わない記述例を示すことも御参考になると考えました。

なお,下記の記述例の主な前提条件は以下になります。

  • STEP 1, 2 のみ対応

  • STEP 2 は「日本語の漢字や仮名とASCII文字の表示幅が 2:1 であると想定して整形する。」と解釈

  • STEP 2 の実装で文字幅の半角/全角の判断は,その文字の(UTF-8 エンコード時の)バイト数(1/2以上)を利用(それによる行の長さのばらつきは許容)

なお,ポイントとなる関数 mblen() についてはリンクの内容を参照ください。

また,「Windows11,Terminal,PowerShell 7.4.2」での実行例を示しますが,等幅フォントで表示すれば結果を確認できます。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <locale.h> 4 5#define MAX_WIDTH 60 // max number of half-width characters 6#define MAX_LINES 100 7#define BUF_SIZE (MAX_WIDTH * MAX_LINES) 8 9int main(void) 10{ 11 char buf[BUF_SIZE]; 12 int c, width, w, len, i, j; 13 14 if (setlocale(LC_CTYPE, "ja_JP.UTF-8") == NULL) { 15 fprintf(stderr, "error: failed to set locale.\n"); 16 exit(1); 17 } 18 19 for (i = 0; i < BUF_SIZE - 1 && (c = fgetc(stdin)) != EOF; i++) 20 buf[i] = c; 21 buf[i] = '\0'; 22 23 width = 0; 24 for (i = 0; i < BUF_SIZE && buf[i] != '\0'; ) { 25 if (buf[i] == '\n') { 26 i++; 27 continue; 28 } 29 if ((len = mblen(&buf[i], MB_CUR_MAX)) < 0) { 30 fprintf(stderr, "error: contains invalid characters.\n"); 31 exit(2); 32 } 33 w = len > 1 ? 2 : 1; 34 if (width + w > MAX_WIDTH) { 35 fputc('\n', stdout); 36 width = 0; 37 } 38 for (j = 0; j < len && i < BUF_SIZE; j++, i++) 39 fputc(buf[i], stdout); 40 width += w; 41 } 42 fputc('\n', stdout); 43 44 exit(0); 45}

PowerShell

1PS > gcc --version 2gcc.exe (x86_64-posix-seh-rev1, Built by MinGW-Builds project) 13.2.0 3 ... 4PS > gcc main.c 5PS > cat .\example.txt 6ステップ1: C言語で入力に含まれる改行は無視し,決まった文字数ごとに改行を入れて整形する。 7ステップ2: 日本語の漢字や仮名とASCII文字の表示幅が 2:1 であると想定して整形する。 8ステップ3: 行頭に「。」や「,」などが来ないように,改行位置を調整する。 9PS > cat .\example.txt | .\a.exe 10ステップ1: C言語で入力に含まれる改行は無視し,決まった文字数 11ごとに改行を入れて整形する。ステップ2: 日本語の漢字や仮名とA 12SCII文字の表示幅が 2:1 であると想定して整形する。ステップ3: 13行頭に「。」や「,」などが来ないように,改行位置を調整する。 14PS >

投稿2024/05/24 15:54

little_street

総合スコア394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.40%

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

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

質問する

関連した質問