ページ 11

文字列の分割

Posted: 2009年3月27日(金) 12:04
by popo
ファイルを読み込んで、"="で分割した値(内容)を取得したいのですが、
うまくうごきません。
ファイルの中身は
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:文字列の分割

Posted: 2009年3月27日(金) 12:32
by 初級者
配列の添字の値を確認してください。

Re:文字列の分割

Posted: 2009年3月27日(金) 12:52
by popo
すみません。
return 0;
がへんなところにはいってました。
fgetsのwhile後です。

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

でした。。。

Re:文字列の分割

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

Re:文字列の分割

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

***bbb 456

***ccc 789

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

Re:文字列の分割

Posted: 2009年3月27日(金) 13:08
by popo
こんな方法よりもっといい方法あるよ。
というご意見もあれば宜しくお願いします。

Re:文字列の分割

Posted: 2009年3月27日(金) 13:21
by Mist
一行目を読み込むと

ch_file="aaa=123\n"

これをstrtokで処理すると

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

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

Re:文字列の分割

Posted: 2009年3月27日(金) 13:33
by popo
>Mistさん
ご丁寧にありがとうございます。
strtokの区切り文字を"="と改行コードにしたら、
ちゃんととってこれました。
助かりました。