
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
strtokはあまり使うことが推奨されない関数です。
Manpage of STRTOK
http://www.linux.or.jp/JM/html/LDP_man-pages/man …
のバグの部分を参照してください。
対策としてはこういう関数を仕立ててみるとか。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int
fill_array(char *buf, double *target, size_t array_max)
{
int count = 0;
int maxcount = (int)array_max;
char *p, *q;
fprintf(stderr, "%s: buf=%p, array_max=%d\n",
__FUNCTION__, buf, array_max);
if (maxcount <= 0)
return -1;
for (count=0, p=buf; count < maxcount; count++) {
double val;
val = strtod(p, &q);
fprintf(stderr, "%s: get %f\n", __FUNCTION__, val);
if ((val==0 && p==q) || !*q || !isspace(*q))
break;
target[count] = val;
p=q;
}
return count;
}
int
main()
{
int count;
int i;
char linebuf[1024];
double numbers[10];
double sum;
fgets(linebuf, sizeof linebuf, stdin);
fprintf(stderr, "input = %s\n", linebuf);
count = fill_array(linebuf, numbers, (sizeof numbers/sizeof numbers[0]));
fprintf(stderr, "count=%d\n", count);
for (i=0, sum=0; i<count; i++) {
printf("%02d: %f\n", i, numbers[i]);
sum += numbers[i];
}
printf("avarage = %f\n", sum/count);
return 0;
}
サンプルのためエラーチェックが甘かったりしますので使うなら
適当に直してくださいませ。
No.2
- 回答日時:
★fgets 関数で読み取った文字列をスペースで分解すればよい。
・過去に似たような質問がありました。
http://oshiete1.goo.ne.jp/qa2749340.html→『fgetsなどをもちいて「改ページ」までの文字列を読み込みたい』
です。この質問では文字列を『改ページ』文字で分割するにはどうすればよいか、という事でした。
今回はスペース文字ですので『改ページ』文字をスペース文字に置き換えて読んでみて下さい。→回答者 No.3
サンプル・ソースの『改ページのコード』の部分をスペース文字(0x20)にすれば分割された文字列
が seek ポインタで得られます。
・今回は strtok 関数での分割を下に紹介します。どちらでも分割できますのでお好きな方法で。
サンプル:
char buff[ 256 ];
char *line;
if ( fgets(buff,sizeof(buff),stdin) != NULL ){ ←端末からの入力
for ( line = strtok(buff," ") ; line != NULL ; line = strtok(NULL," ") ){
/*
分割された文字列 line が得られる
*/
}
}
解説:
・fgets() 関数で半末から複数のスペースで区切られた文字列を取得します。
その後、for 文中で strtok() 関数でスペースで区切られた文字列を分割しています。
strtok() の使い方は、
1回目…strtok( 分割する文字列, 区切り文字群 )
2回目…strtok( NULL, 区切り文字群 )
3回目…strtok( NULL, 区切り文字群 )
:
n回目…strtok( NULL, 区切り文字群 )
と最初の1回目だけ分割する文字列を第1引数に指定します。→内部に登録される。
その後、区切り文字群を指定することでどんどん分割できます。
区切り文字群は毎回同じでも、違っても良い。→今回はすべてスペース文字なので同じ指定です。
その他:
・for 文中で分割された文字列 line を printf 関数など表示すれば良い。
あと端末からの入力を繰り返すのならば、fgets() 関数の部分を if → while に変更すれば
繰り返します。
・以上。fgets() と strtok() 関数の組み合わせでした。→他にも strchr での分割もあります。
参考URL:http://oshiete1.goo.ne.jp/qa2749340.html
No.1
- 回答日時:
この回答への補足
ご回答ありがとうございます。strtok()を使用したものも考えて見ます。
fgets()とsscanf()を組み合わせて使用する、という場合はどうなるでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsで拾われる改行文字を削除...
-
CStringのFindで文字列検索を行...
-
fgets関数を使用したときの文字...
-
反転した数値を表示させるやり方
-
1行の文字列を時間差で表示する...
-
sscanfとscanfの違いがよくわか...
-
C言語 空白の行(改行のみ)が...
-
charと%c , %s の関係について
-
小文字のみを数える方法
-
文字の入れ替えについて
-
fgetsでバッファ残留文字列を無...
-
文字列の途中に「0」がある場...
-
C++
-
C言語のisdigit関数を使った問...
-
教えていただけませんか?C言語...
-
C言語のステップ数をカウントす...
-
ブランクのチェック
-
「Aに対するBの割合」と「Aに対...
-
Enterキーを押されたら次の処理...
-
「指定されたキャストは有効で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
fgetsで拾われる改行文字を削除...
-
sscanfとscanfの違いがよくわか...
-
反転した数値を表示させるやり方
-
charと%c , %s の関係について
-
fgets関数を使用したときの文字...
-
Cで「大文字、小文字の判定」は...
-
strstrを利用しない文字列検索...
-
文字列中に含まれる文字の個数...
-
C言語のステップ数をカウントす...
-
itoaわかりません
-
C++
-
C/C++言語で日本語処理
-
C言語 空白の行(改行のみ)が...
-
CStringについて
-
小文字のみを数える方法
-
教えていただけませんか?C言語...
-
ブランクのチェック
-
str[j++]の意味
-
初歩的なプログラムなんですが...
おすすめ情報