OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

文字取得

  • すぐに回答を!
  • 質問No.123026
  • 閲覧数60
  • ありがとう数2
  • 気になる数0
  • 回答数6
  • コメント数0

お礼率 33% (5/15)

教えてください!
fgetsでストリームから文字をline[20]に格納できたとします。
その後、lineから1文字づつ参照していき、
カンマで区切られたデータをそれぞれ別の変数に格納したいのです。
1文字づつ参照するためにはどんな関数でできますか?
getcやfgetcではできないと思うのですが・・・。
通報する
  • 回答数6
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.6
レベル9

ベストアンサー率 36% (37/102)

No5 の修正です。
インクリメントの場所を間違ってました。

int i;
char *p[20];

i=0;
p[i] = strtok(line, ",");
while(p[i]!=NULL){
i++;
p[i] = strtok(NULL, ",");
}
お礼コメント
yoro

お礼率 33% (5/15)

無事解決しました。
みなさんありがとうございます。
また何かわからないことがあったら
ここに投稿するつもりです。
投稿日時 - 2001-08-23 17:14:40
-PR-
-PR-

その他の回答 (全5件)

  • 回答No.1
レベル13

ベストアンサー率 40% (404/988)

お疲れ様です。 配列変数ですね。さて、回答というか、ヒントです char line[20]; で、いいですかね?(char でも、int でも良いのですが)こう仮定して話します。 line[0] = 一文字目(1バイト目) line[1] = 二文字目(2バイト目) に格納されていますので、0、1を for文のカウンタを使用すれば、何文字目と言う感じで、扱えます。 でわで ...続きを読む
お疲れ様です。

配列変数ですね。さて、回答というか、ヒントです

char line[20];
で、いいですかね?(char でも、int でも良いのですが)こう仮定して話します。

line[0] = 一文字目(1バイト目)
line[1] = 二文字目(2バイト目)

に格納されていますので、0、1を for文のカウンタを使用すれば、何文字目と言う感じで、扱えます。

でわでわ
補足コメント
yoro

お礼率 33% (5/15)

文字列に全角で「あ」と入っていたらどうですか?
できませんよね?
そういう場合にも対応したいのですが。
投稿日時 - 2001-08-23 13:57:51


  • 回答No.2
レベル10

ベストアンサー率 31% (44/140)

char line[20]; としてるのですよね。 1文字ずつでしたら、line[0]、line[1]、line[2]・・・line[19]と いった感じで(1)文字づつ参照できます。 気をつけなければならないのは、line[n]が0x00 の場合、そこで文字は最後です。 以降のデータは、内容が保証されませんので注意してください。 もうひとつ、ヒントとして、カンマ区切りのデータでし ...続きを読む
char line[20];

としてるのですよね。

1文字ずつでしたら、line[0]、line[1]、line[2]・・・line[19]と
いった感じで(1)文字づつ参照できます。
気をつけなければならないのは、line[n]が0x00 の場合、そこで文字は最後です。
以降のデータは、内容が保証されませんので注意してください。

もうひとつ、ヒントとして、カンマ区切りのデータでしたら、
sscanfといった関数も便利かもしれません。

がんばってください。では。
  • 回答No.3
レベル9

ベストアンサー率 38% (24/62)

こんにちわ 「1文字ずつ参照して・・・」の部分は下の方のヒント(回答?)で良いと思います。 で、もう一つの方法(のヒント)を。 「ある文字で区切られたデータを分けて取得」の部分ですが、 「strchr」と言う関数と「strrchr」と言う関数があります。 ここで詳細や使用方法は説明しませんが(ヘルプを見てくださいね)、 これを上手く使うと一つ一つ調べる手間は省けます。 頑張ってく ...続きを読む
こんにちわ

「1文字ずつ参照して・・・」の部分は下の方のヒント(回答?)で良いと思います。

で、もう一つの方法(のヒント)を。
「ある文字で区切られたデータを分けて取得」の部分ですが、
「strchr」と言う関数と「strrchr」と言う関数があります。
ここで詳細や使用方法は説明しませんが(ヘルプを見てくださいね)、
これを上手く使うと一つ一つ調べる手間は省けます。

頑張ってください。
  • 回答No.4
レベル13

ベストアンサー率 40% (404/988)

こんにちは、ふたたび。 VCは、離れて久しいぞな(^^; さて、日本語(1ワード=2バイト)が入ると言う事ですね。 すると、各Cコンパイラ(・・・というか、.hに関数が準備されていると思います)ANSI C において、日本語処理は定められていないと思いました。(ウチ最新のコンパイラじゃないので、情報が古いかも・・・) コンパイラ次第なのですがVC++5.0(Visual studio97)では ...続きを読む
こんにちは、ふたたび。
VCは、離れて久しいぞな(^^;

さて、日本語(1ワード=2バイト)が入ると言う事ですね。
すると、各Cコンパイラ(・・・というか、.hに関数が準備されていると思います)ANSI C において、日本語処理は定められていないと思いました。(ウチ最新のコンパイラじゃないので、情報が古いかも・・・)
コンパイラ次第なのですがVC++5.0(Visual studio97)では、 _mbsnicmp
という関数がマルチバイトの文字比較となっているようですね。
  <mbstring.h>
を include してください。
※ただし、実際に組んだ(使用した)わけではないので、この関数がお使いの環境で可能かどうか怪しいところではあります。
ちなみに、このバージョンのこのコンパイラ以外では、全く違う名前の関数で、この機能を実現しているかもしれません。

コンパイラの種類、バージョンを補足いただければ、分かる方が居るかもしれません。
  • 回答No.5
レベル9

ベストアンサー率 36% (37/102)

格納したあとに分割するという考え方でどうでしょうか? int i; char *p[20]; i=0; p[i] = strtok(line, ","); while(p[i]!=NULL){ p[i] = strtok(NULL, ","); i++ }
格納したあとに分割するという考え方でどうでしょうか?

int i;
char *p[20];

i=0;
p[i] = strtok(line, ",");
while(p[i]!=NULL){
p[i] = strtok(NULL, ",");
i++
}
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ