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

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

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

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

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

1回答

2045閲覧

[C言語]標準入力で文章を入力し、標準出力に行番号と文字数を出力したい

ryuuabis

総合スコア24

C

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

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2021/11/02 09:20

編集2021/11/02 09:36

前提・実現したいこと

「標準入力」欄に英文(英数字の文字列)を入力すると,入力した英文の各行に,1から始まる行番号とその行の文字数を付加して「標準出力」に表示するプログラムを作成したいです。

行番号は,行の先頭から3桁の右詰めで表示したいです。
行の文字数は,3桁の行番号に続けて「[」を表示し,そのあとに文字数を3桁の右詰めで表示し,そのあとに「]」を表示したいです。
行の文字数のあとに半角の空白1文字を表示し,そのあとに入力した行の内容を表示したいです。

自分で作成した、➀行番号を出力するプログラム、➁文字数を出力するプログラム、➂それらを組み合わせたプログラムをソースコードに表示させます。

➂の組み合わせたプログラムが、テストどおり行かないないので、教えていただきたいです、、
よろしくお願いします。
出ているエラーは、標準出力の文字数が1多くなってしまうことです。

例文
標準入力
again access microphone↵
z responsible↵
標準出力
1[ 23] again access microphone↵
2[ 13] z responsible↵

↵はエンターキーを表していて、実際には入力していないです。

自分が作成した➂のプログラムを実行すると、以下のようになってしまいます。
上記のように出力させるには、どこを修正すればよろしいでしょうか?

➂プログラム実行すると(行番号はOKだが、文字数がテストケースより1多くなってしまう。)
標準入力
again access microphone↵
z responsible↵
標準出力
1[ 24] again access microphone↵
2[ 14] z responsible↵

該当のソースコード

➀行番号を出力するプログラム #include <stdio.h> #define SIZE 100 int main(void){ char line[SIZE]; int i; for (i=1; fgets(line, SIZE, stdin) !=NULL; i++) { printf("%3d : ", i); fputs(line, stdout); } return 0; } ➁文字数を出力するプログラム #include <stdio.h> #include <string.h> #define SIZE 100 int main(void){ char line[SIZE]; int len; for (; fgets(line, SIZE, stdin)!=NULL;){ len = strlen(line); printf("%3d : %s", len-1, line); } return 0; } ➂上2つを組み合わせた、行番号と文字数を出力したいプログラム #include <stdio.h> #include <string.h> #define SIZE 100 #define LSIZE 10 int main(void){ char line[LSIZE][SIZE]; int len; int cnt=0; for (; fgets(line[cnt], SIZE, stdin)!=NULL&&cnt<LSIZE;cnt++); for (int i=0;i<cnt;i++) { len = strlen(line[i]); printf("%3d[%3d]%s",i+1,len,line[i]); } return 0; }

試したこと

1と2は、個別にテストしてうまく表示します、、

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

y_waiwai

2021/11/02 09:24

問題は何でしょうか。 文字数がちがうとこ?
ryuuabis

2021/11/02 09:32

あ、すみません、文字数が一つ多くなってしまうところです。
melian

2021/11/02 09:36

②では len-1 しているのに。。。
ryuuabis

2021/11/02 09:41

すみません、ありがとうございました!m(_ _)m
dodox86

2021/11/02 09:43

melianさんが指摘されているとおり、①と②を足した③のプログラムでは、②で行末1文字分を意識したと思われる-1がされていませんね。だから結果が一致しない。
guest

回答1

0

ベストアンサー

おそらく、1行読み込んだ文字列の後尾に改行の文字が入っているために、それ込みで文字列を出してるため1多いんでしょう。
文字列の後尾に改行コードがある場合には-1すればよろしいかと。

投稿2021/11/02 09:35

y_waiwai

総合スコア88042

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

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

ryuuabis

2021/11/02 09:40

標準入力には、以下のように↵は入れてない状態です。。 again access microphone z responsible
ryuuabis

2021/11/02 09:42

#include <stdio.h> #include <string.h> #define SIZE 100 #define LSIZE 10 int main(void){ char line[LSIZE][SIZE]; int len; int cnt=0; for (; fgets(line[cnt], SIZE, stdin)!=NULL&&cnt<LSIZE;cnt++); for (int i=0;i<cnt;i++) { len = strlen(line[i]); printf("%3d[%3d]%s",i+1,len-1,line[i]); } return 0; } ありがとうございました!
y_waiwai

2021/11/02 09:44

改行コードはプリントさせても目には見えません。 ここはひとつ、デバッグ環境を整えてはどうでしょう コードの任意の場所で実行を止めて、変数のナカミを見ることができます また、1行づつ実行させて、動作を確認できます Windowsなら、VisualStudio入れてみましょう
y_waiwai

2021/11/02 09:45

文字数を-1するのもいいですが、それをするとファイルの最終行など、1文字少なく出る場合がありますよ
ryuuabis

2021/11/02 09:51

>改行コードはプリントさせても目には見えません。 2行目を改行しているということを伝えたくて改行コードを質問では書いていますが、実際には打っていないということでした。。 >ここはひとつ、デバッグ環境を整えてはどうでしょう コードの任意の場所で実行を止めて、変数のナカミを見ることができます また、1行づつ実行させて、動作を確認できます Windowsなら、VisualStudio入れてみましょう 知りませんでした、Macなので、環境を整えて確認してみます。 >文字数を-1するのもいいですが、それをするとファイルの最終行など、1文字少なく出る場合がありますよ たまにそういう場合があるということでしょうか?
ryuuabis

2021/11/02 09:54

重ねて質問して申し訳ないのですが、 標準入力 again access microphone↵ z responsible↵ 標準出力 1[ 24]again access microphone↵ 2[ 14]z responsible↵ のようになってしまい、[ 24]とagainの間にスペースを入れたいのですが、どのようにすればよろしいのでしょうか?
dodox86

2021/11/02 09:55

今は恐らく勉強中なのでしょうからいいのかもしれませんが、fgets()は指定のサイズを超えるとそこで切って返ってくるので、改行が入らない場合がありますよ。質問者さんの今のコードですと、例えばSIZEの100、末端の'\0'を除いて99文字以上入力すると、そこで切れて返ってきます。1行に100文字以上入れると2行扱いで動くはずです。(試してみましょう)
y_waiwai

2021/11/02 09:55

デバッグ環境で、実際に読み込んだ文字列を見てみましょう。 どういうデータが実際に入ってるか見れます。 まあ、とりあえずのつじつま合わせに-1するってのは、まあ、そのば限りに課題とか趣味ならいいですけど、なんか重要なことだったら、えらい目に会いますよ きちんと原因を追求しときましょうよ
ryuuabis

2021/11/02 09:56

すみません、上のスペースできました、気にしないでくださいませ。 ありがとうございました。m(_ _)m
ryuuabis

2021/11/02 09:59

>今は恐らく勉強中なのでしょうからいいのかもしれませんが、fgets()は指定のサイズを超えるとそこで切って返ってくるので、改行が入らない場合がありますよ。質問者さんの今のコードですと、例えばSIZEの100、末端の'\0'を除いて99文字以上入力すると、そこで切れて返ってきます。1行に100文字以上入れると2行扱いで動くはずです。(試してみましょう) 長文を入力すると、セグメンテーションフォルトが発生、と出ました。
dodox86

2021/11/02 10:04

> 長文を入力すると、セグメンテーションフォルトが発生、と出ました。 それはfgets()とはまた別の問題ですね。勉強の為ならば「1行は改行を含めて100文字以下」と制限付きでやるのはアリだと思います。実運用、業務のコードではナシですが。
dodox86

2021/11/02 10:12

しかし、回答主であるy_waiwaiさんの本欄[2021/11/02 18:55]のコメント、 > まあ、とりあえずのつじつま合わせに-1するってのは、まあ、そのば限りに課題とか趣味ならいいですけど、なんか重要> なことだったら、えらい目に会いますよ > きちんと原因を追求しときましょうよ 「原因を追究し、理解しておきましょう」というのはまったくその通りだと思います。以上です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問