
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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語初心者です。計算がうまく...
-
プログラミングが分かりません。
-
C言語のエラーについて
-
アセンブリプログラムで特定の...
-
spi 非言語
-
クレーンでのCFブレーキとな...
-
マンションのデータ流用
-
順列、4桁の整数をつくる問題
-
SPI 非言語の問題です
-
Audacityのマイク音量
-
互いに素と負の数
-
rlc直列回路の波形を観測する時...
-
複数のシリンダーの同調化にコ...
-
線形代数 行列の計算 12.2 d6
-
数学の参考書に 「y=8x」は「y...
-
誤まりとは、誤りと主張する者...
-
三相発電機(オルタネーター)...
-
大学の線形代数についての質問...
-
物理の波についてです 時刻12/8...
-
反転増幅回路の周波数特性の理論値
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Expression: nptr != NULL
-
リターンキー又は、スペースキ...
-
getch / putch用のヘッダ
-
TCP/IP: 非ソケットに対するソ...
-
アセンブリプログラムで特定の...
-
C言語プログラミングで・・・
-
C言語のエラーについて
-
'printf':識別子が見つかりませ...
-
C言語 コンパイルエラー(文字...
-
c言語プログラミングで初項を1....
-
c言語についての質問です。
-
加減剰余のオーバーフローについて
-
最も文字数が多い行番号と文字...
-
コンソールAPIのSetConsoleScre...
-
C言語で自作ヘッダーを作ったの...
-
プログラミングが分かりません。
-
C言語のソースコードについて教...
-
クレーンでのCFブレーキとな...
-
SPI 非言語の問題です
-
複数のシリンダーの同調化にコ...
おすすめ情報