No.4ベストアンサー
- 回答日時:
以下のサンプルは、string.hを使わない方法です。
でも、本当は、文字列の長さは、strlen関数使うと簡単なのは覚えておいてください。
最大文字数と最小文字数の両方をチェックします。
※このプログラムの制限事項
(1)1行の長さはNULLを含めて最大128バイト
(2)同じ長さの行が複数あっても一番最初の行が答えとなる。
FILE *stream;
char szLine[128];
int nMaxLen = 0; // 最大文字数
int nMaxLineNo = 0; // 最大文字数の行番号
int nMinLen = 0; // 最小文字数
int nMinLineNo = 0; // 最小文字数の行番号
if( (stream = fopen( "C:\\sample.txt", "r" )) != NULL )
{
// ファイルオープン成功
for (int nLineNo = 1; ; nLineNo++) {
if( fgets( szLine, sizeof(szLine), stream ) == NULL)
{
// エラーあるいはファイルの終わりに達したのでループを抜ける
break;
}
else
{
// strlenが使えないので自分で文字列の長さを調べる
for (int nLength = 0; nLength < sizeof(szLine); nLength++) {
if (szLine[nLength] == '\n') {
// 行の最終に達したのでループを抜ける
break;
}
}
if (nLineNo == 1) { // ファイルの1行目の時
// ファイルの1行目の文字数と行番号は強制的に最小値としておく
nMinLen = nLength;
nMinLineNo = nLineNo;
}
// 最大文字数チェック
if (nMaxLen < nLength) {
// 今回readした行は今までで一番長いのでこれを最大値とする
nMaxLen = nLength;
// この時の行番号を最大文字数の時の行番号として覚えておく
nMaxLineNo = nLineNo;
}
// 最小文字数チェック
if (nMinLen > nLength) {
// 今回readした行は今までで一番短いのでこれを最小値とする
nMinLen = nLength;
// この時の行番号を最小文字数の時の行番号として覚えておく
nMinLineNo = nLineNo;
}
}
}
fclose( stream );
}
printf("最大文字数=%d文字(%d行目)、最小文字数=%d文字(%d行目)\n", nMaxLen, nMaxLineNo, nMinLen, nMinLineNo);
実はNULLもまだ習ってないんでその部分もよくわかりません^^;
他の部分は参考にさせてもらいますね^^
助かりました。ありがとうございました。
No.7
- 回答日時:
>#include <string.h>をまだ習ってないんですが、これなしで作ることは可能でしょうか。
string.h は strlen(文字列の長さを求める関数) を使うために使っていますが、もちろん自分で作ることができます。
Cでの文字列は、最後に'\0'があるという約束があるので、'\0'がでてくるまで数えれば良いです。
#3では、fgetsを使って、一行入力をしていますが、
用意しているバッファを超えているときに一行を#3のプログラムではうまく扱えません。
むしろ、ファイルから1文字ずつ読み込んで'\n'が現れるまでの文字列を数えて'\n'が現れたら行の終わりとして計数したほうがいいかもしれません。
そうすると、必然的にstrlenは使わなくてすみます。
No.5
- 回答日時:
No.4です。
No.4のサンプルソースは、C++書式です。
もし、Cを勉強されてるなら、for文の中で直接宣言している int nLineNo とかは、関数の先頭に移動してください。
for (int nLineNo = 0・・・・
↓
int nLineNo;(関数の先頭で)
(中略)
for (nLineNo = 0・・・・
#include<stdio.h>
int main(void)
{
int c;
int Line=0, wd=0;
int small=128,big=0;
int maxline=0,maxword=0;
int minword=0,minline=0;
while((c=getchar())!=EOF){
wd++;
if(c=='\n'){
Line++;/* 一行読み込んだ */
if(wd>big){/*改行前までの数が、今までのbigより大きければ*/
big=wd;
maxline=Line;
}
if(wd<small){/*改行前までの数が、今までのsmallより小さければ*/
small=wd;
minline=Line;
}
wd=0;/*改行が終ったあと、一度0に初期化*/
}
}
printf("行番号 %d で、文字数 %d が最高!\n",maxline, big);
printf("行番号 %d で、文字数 %d が最低!\n",minline, small);
return(0);
}
こういうプログラムになりました^^;
ありがとうございました^^
No.3
- 回答日時:
標準入力からテキストを入力して最も文字数が多い行番号と文字数を求める
一行が128より長い様な場合。
改行コードは数えるか?
については、自分で考えてください。
#include <stdio.h>
#include <string.h>
#define BUFFSIZE 128
void main(void){
char buff[BUFFSIZE];
int line=0, len;
int maxLine=0,maxChars=0;
while(NULL!=fgets(buff,BUFFSIZE,stdin)){
line++;/* 一行読み込んだ */
len=strlen(buff); /* 文字数を数える */
if(maxChars<len){ /* 今の行が最高値を更新 */
maxChars=len;
maxLine=line;
}
}
printf("行番号 %d で、文字数 %d が最高!\n",maxLine, maxChars);
}
#include <string.h>をまだ習ってないんですが、これなしで作ることは可能でしょうか。
最小値も求めないといけない課題なんで自力で頑張ってみます
ありがとうございました。
No.2
- 回答日時:
この方法がわからないということは、プログラミングは全く未経験でしょうか?
(1)ファイルの長さ格納用変数を0初期化で宣言。
(2)ファイル開く
(3)forループの中でファイルの最後まで一行単位でReadする。
(4)readする時、readしたバッファの長さを調べる。
ファイルの長さ格納用変数と長さを比較して、
今readしたバッファの長さの方が長いなら、
ファイルの長さ格納用変数にそれを代入する。
同時にその時のfor文のカウンタ値を退避しておく。
以上で、forループから抜けた時の、ファイルの長さ格納用変数の値と、退避しておいたfor文カウンタの値があなたの求めるものです。
勉強始めて一カ月です^^;
「ファイルの長さ格納用変数と長さを比較して、今readしたバッファの長さの方が長いなら、ファイルの長さ格納用変数にそれを代入する。」ってのがよくわからないんでもう少し考えてみます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Java 南京錠 2 2023/02/04 11:46
- Excel(エクセル) Excel2019のデータ入力に便利な関数について 4 2023/07/06 05:42
- Excel(エクセル) エクセル関数について 8 2023/06/28 17:04
- Java Java 配列<選挙> 4 2023/07/31 15:07
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- Excel(エクセル) MID関数について 2 2022/04/22 09:13
- Excel(エクセル) 関数EXACT(文字列,文字列)とexcelVBA 3 2022/04/14 15:07
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
コンソールAPIのSetConsoleScre...
-
プログラミングが分かりません。
-
C言語のエラーについて
-
c言語プログラミングで初項を1....
-
分割コンパイルの手順と方法に...
-
プログラムがエラーが出る原因
-
Expression: nptr != NULL
-
素数について
-
'printf':識別子が見つかりませ...
-
整合フィルタ(matched filter)...
-
物理の波についてです 時刻12/8...
-
複数のシリンダーの同調化にコ...
-
トリガの意味について
-
入力容量(Input Capacitance)...
-
交流、パルス波、バースト波
-
クレーンでのCFブレーキとな...
-
火力発電 蒸気タービンのMSV、C...
-
減衰係数の求め方がわかりません
-
教えてください。
-
(2x-1)2乗=5の答えを解説付き...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語プログラミングで初項を1....
-
Expression: nptr != NULL
-
'printf':識別子が見つかりませ...
-
TCP/IP: 非ソケットに対するソ...
-
C言語のソースコードについて教...
-
プログラミングが分かりません。
-
C言語初心者です。計算がうまく...
-
加減剰余のオーバーフローについて
-
C言語のエラーについて
-
リターンキー又は、スペースキ...
-
最も文字数が多い行番号と文字...
-
分割コンパイルの手順と方法に...
-
プログラムがエラーが出る原因
-
素数について
-
エラーの原因がわかりません。
-
getch / putch用のヘッダ
-
C言語 コンパイルエラー(文字...
-
C言語で10個の数字を読み込んで...
-
クレーンでのCFブレーキとな...
-
SPI 非言語の問題です
おすすめ情報