文字列の分割

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
popo

文字列の分割

#1

投稿記事 by popo » 16年前

ファイルを読み込んで、"="で分割した値(内容)を取得したいのですが、
うまくうごきません。
ファイルの中身は
aaa=123
bbb=456

のようになっています。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
    int     i_idx;
    FILE    *kp_fp_db;
    char    ch_file[100];
    char    *cp_t;
    char    *cp_info[2];
    
    kp_fp_db = fopen("info.txt", "r");
    if ( kp_fp_db == NULL ){
        return 1;
    }

    while( fgets(ch_file,100,kp_fp_db) != NULL ){
        cp_t = strtok(ch_file, "=");
        while( cp_t != NULL ){
            cp_info[i_idx] = cp_t;
            cp_t = strtok(NULL,"=");
            i_idx++;
        }
        printf("***%s %s\n",cp_info[0],cp_info[1]);
        return 0;
    }
}

初級者

Re:文字列の分割

#2

投稿記事 by 初級者 » 16年前

配列の添字の値を確認してください。

popo

Re:文字列の分割

#3

投稿記事 by popo » 16年前

すみません。
return 0;
がへんなところにはいってました。
fgetsのwhile後です。

>初級者さん
ch_fileの最後の改行コードがおかしなことになっているのかと、
配列の要素を[3]に増やしてみました。
が、
あまりかわりませんでした。
ファイルの内容が1行目はちゃんととれてましたが、2行目以降はおかしかったが、
1行目printf
改行
2行目printf
改行
3行目???なんか文字化け

でした。。。

Mist

Re:文字列の分割

#4

投稿記事 by Mist » 16年前

まず、i_idxが初期化していないために初期状態で0であることが保証されていません。
次に、一行分の処理が終わった時にi_idxを0に戻していないのでi_idxは増え続けて範囲外アクセスになります。
コンパイラが何か分かりませんが初期化せずにi_idxを使用しているというワーニングが出ていませんか?

popo

Re:文字列の分割

#5

投稿記事 by popo » 16年前

>Mistさん
ありがとうございます。
コンパイラはgccを使っていますが、warningでていました。
i_idxをファイル読込のwhileの先頭で0に初期化しました。
すると、値はちゃんと(?)とれていますが、
***aaa 123

***bbb 456

***ccc 789

:
と改行されてしまいました。

popo

Re:文字列の分割

#6

投稿記事 by popo » 16年前

こんな方法よりもっといい方法あるよ。
というご意見もあれば宜しくお願いします。

Mist

Re:文字列の分割

#7

投稿記事 by Mist » 16年前

一行目を読み込むと

ch_file="aaa=123\n"

これをstrtokで処理すると

cp_info[0]="aaa\0123\n"
cp_info[1]="123\n"

となりますから、そう表示されるのはプログラムの通りです。
行末の改行コードを取り去る処理が必要です。

popo

Re:文字列の分割

#8

投稿記事 by popo » 16年前

>Mistさん
ご丁寧にありがとうございます。
strtokの区切り文字を"="と改行コードにしたら、
ちゃんととってこれました。
助かりました。

閉鎖

“C言語何でも質問掲示板” へ戻る