【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19292

関数間のポインタ配列の受け渡しについて
投稿者---TOM(2005/01/18 12:18:39)


はじめまして
C言語初心者です。
配列のポインタを呼び元の関数にわたして構造体にセットするプログラムを作成中ですが受け渡し方法がわかりません。
下にプログラムを書くのでよろしくお願いします。

#include    <stdio.h>
#include    <string.h>

static char *StrSplit(char* str,const char* delimstr);

typedef struct {
    char *genre;                    
    char *id;
    char title[255];
    char titlered[255];
    char txt[2000];
    char txtred[2000];
    char ipdata[16];
    int delflg;
} csv_t;

int main()
{
    FILE *fp ;
    char read[256];
    char *splitcsv ;
    int i = 0;
    int j ;
    csv_t p_csv_t ;
    fp = fopen("/home/csv/20050113.csv","r");
    while(1){   
        memset(read,0x00,256);
        if(fgets(read,256,fp)==NULL){
            break;    
        }
        
        splitcsv = StrSplit(read,",") ;

        p_csv_t.genre = splitcsv;

        i++ ;
    }
    close(fp);
    return 0;
}

char *StrSplit(char *str, const char *delimstr)
{
    char *splitstr[53];
    char *delim_point ;
    int i ;
    int j ;
    memset(splitstr,0x00,53) ;
    const size_t delim_len = strlen(delimstr);
    i = 0 ;
    while(1){
        if((delim_point = strstr(str, delimstr)) != NULL){
            *delim_point = '\0';
            splitstr[i]  = str ;
            for(j = 0; j < delim_len; j++) delim_point++;
        }else{
            splitstr[i]  = str ;
            break ;
        }
        i++ ;
        str = delim_point ;
    }

    return *splitstr;
    
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:関数間のポインタ配列の受け渡しについて 19293 nop 2005/01/18 13:00:55
<子記事> Re:関数間のポインタ配列の受け渡しについて 19294 Craft 2005/01/18 13:30:04


No.19293

Re:関数間のポインタ配列の受け渡しについて
投稿者---nop(2005/01/18 13:00:55)


>配列のポインタを呼び元の関数にわたして構造体にセットするプログラムを作成中ですが受け渡し方法がわかりません。

現状どうなっていて、どうなって欲しいのか?



この投稿にコメントする

削除パスワード

No.19294

Re:関数間のポインタ配列の受け渡しについて
投稿者---Craft(2005/01/18 13:30:04)


>配列のポインタを呼び元の関数にわたして構造体にセットするプログラムを作成中ですが受け渡し方法がわかりません。
>下にプログラムを書くのでよろしくお願いします。

main()関数のループでは、同じcsv_t構造体にデータの代入を繰り返しているような作りになっているし、
StrSplit()関数内の
   splitstr[i] = str;
も妙な感じです。まだ動かすところまでいっていないのかな?。

>char *StrSplit(char *str, const char *delimstr)
ここから推測して、求めている内容が、関数の中でセットした文字列をポインタとして構造体に文字列として保持したいということであれば、
StrSplit()内で、malloc()を使用してメモリを割り当ててmain()に返す以外、方法はないように思えます。


この投稿にコメントする

削除パスワード

No.19295

Re:関数間のポインタ配列の受け渡しについて
投稿者---Craft(2005/01/18 14:43:54)


呼び出し先でmalloc()を使用して文字列を作成し、呼び出し元に返すサンプルをつけておきます。
#include <stdio.h>
#include <string.h>
#include <malloc.h>

char *a(void);

int main(void)
{
    char *p;

    /* function call */
    p = a();
    if( p != (char *)NULL ){
        /* メモリが確保できていれば設定されたメッセージを表示 */
        printf( "data = %s\n", p );
        /* 確保したメモリの解放 */
        free(p);
    }
    else{
        printf( "memory allcation error!\n" );
    }

    return 0;
}

char *a(void)
{
    char *data;

    /* メモリの確保 */
    data = (char *)malloc( sizeof(char) * 20 );
    if( data != (char *)NULL ){
        /* 成功したらメッセージを埋める */
        memset( data, '\0', 20 );
        strcpy( data, "test string" );
    }
    
    return data;
}




この投稿にコメントする

削除パスワード

No.19298

Re:関数間のポインタ配列の受け渡しについて
投稿者---TOM(2005/01/18 15:21:07)


サンプルありがとうございます。
このサンプルのa関数内で
strcpy( data, "test string" );
ではなくて
data[0]="abc"
data[1]="def"
data[2]="ghi"
という感じにしたいのですが無理なのでしょうか。


>呼び出し先でmalloc()を使用して文字列を作成し、呼び出し元に返すサンプルをつけておきます。
><pre>#include <stdio.h>
#include <string.h>
#include <malloc.h>

char *a(void);

int main(void)
{
char *p;

/* function call */
p = a();
if( p != (char *)NULL ){
/* メモリが確保できていれば設定されたメッセージを表示 */
printf( "data = %s\n", p );
/* 確保したメモリの解放 */
free(p);
}
else{
printf( "memory allcation error!\n" );
}

return 0;
}

char *a(void)
{
char *data;

/* メモリの確保 */
data = (char *)malloc( sizeof(char) * 20 );
if( data != (char *)NULL ){
/* 成功したらメッセージを埋める */
memset( data, '\0', 20 );
strcpy( data, "test string" );
}

return data;
}

</pre>



この投稿にコメントする

削除パスワード

No.19297

Re:関数間のポインタ配列の受け渡しについて
投稿者---TOM(2005/01/18 14:55:09)


説明不足ですいません。
CSVファイル(abc,def,gh…)のデータを一行ずつ抜き出してStrSplit関数内で文字列の配列に格納し、そのポインタをmain関数に渡して構造体にセットしたい。
現状コンパイルエラーがでて実行できない状態です。
設計的におかしいのでしょうか。

>>配列のポインタを呼び元の関数にわたして構造体にセットするプログラムを作成中ですが受け渡し方法がわかりません。
>>下にプログラムを書くのでよろしくお願いします。
>
>main()関数のループでは、同じcsv_t構造体にデータの代入を繰り返しているような作りになっているし、
>StrSplit()関数内の
>
   splitstr[i] = str;
も妙な感じです。まだ動かすところまでいっていないのかな?。
>
>>char *StrSplit(char *str, const char *delimstr)
>ここから推測して、求めている内容が、関数の中でセットした文字列をポインタとして構造体に文字列として保持したいということであれば、
>StrSplit()内で、malloc()を使用してメモリを割り当ててmain()に返す以外、方法はないように思えます。



この投稿にコメントする

削除パスワード

No.19301

Re:関数間のポインタ配列の受け渡しについて
投稿者---Craft(2005/01/18 17:14:31)


>説明不足ですいません。
>CSVファイル(abc,def,gh…)のデータを一行ずつ抜き出してStrSplit関数内で文字列の配列に格納し、そのポインタをmain関数に渡して構造体にセットしたい。

なるほど。やりたいことはなんとなくわかりました。
すると、さっきのアドバイスはちょっとずれてますね。

malloc()を使うのはかわりませんが、こんな感じでやります。
コメント少ないので、なにをしているかきちんと把握してから実装してください。
---
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <malloc.h>

char **a(char *);

int main(void)
{
    char **ppList;
    int i;
    static char text[40] = "abc,def,ghi,jkl,mno,pqr,stu";

    /* function call */
    ppList = a(text);
    if( ppList != (char **)NULL ){
        /* メモリが確保できていれば設定されたメッセージを表示 */
        for( i = 0; i < 20; i++ ){
            if( ppList[i] != NULL ){
                printf( "data%02d = %s\n", i, ppList[i] );
            }
        }
        free( ppList );
    }
    else{
        printf( "memory allcation error!\n" );
    }

    return 0;
}

char **a(char *text)
{
    char **ppData;
    char *found, *target;
    char *mem;
    int cnt;
    int i;

    /* メモリの確保 */
    cnt = 0;
    ppData = (char **)malloc( sizeof(char *) * 20 );
    if( ppData != (char **)NULL ){
        /* 成功したら見つけた文字列へのポインタを埋める */
        for( i = 0; i < 20; i++ ){
            ppData[i] = (char *)NULL;
        }

        /* inputから","をサーチし、
           文字列の先頭のポインタをポインタ配列にいれる */
        target = text;
        do{
            found = strstr(target,",");
            if( found != (char *)NULL ){
                *found = '\0';
                ppData[cnt] = target;

                found ++;
                target = found;
                cnt ++;
            }
            else{
                ppData[cnt] = target;
            }
        }while( found != (char *)NULL );
    }

    return ppData;
}
---


この投稿にコメントする

削除パスワード

No.19304

Re:関数間のポインタ配列の受け渡しについて
投稿者---TOM(2005/01/18 18:50:53)


解決しました。
ありがとうございました。


>>説明不足ですいません。
>>CSVファイル(abc,def,gh…)のデータを一行ずつ抜き出してStrSplit関数内で文字列の配列に格納し、そのポインタをmain関数に渡して構造体にセットしたい。
>
>なるほど。やりたいことはなんとなくわかりました。
>すると、さっきのアドバイスはちょっとずれてますね。
>
>malloc()を使うのはかわりませんが、こんな感じでやります。
>コメント少ないので、なにをしているかきちんと把握してから実装してください。
>---
><pre>#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <malloc.h>

char **a(char *);

int main(void)
{
char **ppList;
int i;
static char text[40] = "abc,def,ghi,jkl,mno,pqr,stu";

/* function call */
ppList = a(text);
if( ppList != (char **)NULL ){
/* メモリが確保できていれば設定されたメッセージを表示 */
for( i = 0; i < 20; i++ ){
if( ppList[i] != NULL ){
printf( "data%02d = %s\n", i, ppList[i] );
}
}
free( ppList );
}
else{
printf( "memory allcation error!\n" );
}

return 0;
}

char **a(char *text)
{
char **ppData;
char *found, *target;
char *mem;
int cnt;
int i;

/* メモリの確保 */
cnt = 0;
ppData = (char **)malloc( sizeof(char *) * 20 );
if( ppData != (char **)NULL ){
/* 成功したら見つけた文字列へのポインタを埋める */
for( i = 0; i < 20; i++ ){
ppData[i] = (char *)NULL;
}

/* inputから","をサーチし、
文字列の先頭のポインタをポインタ配列にいれる */
target = text;
do{
found = strstr(target,",");
if( found != (char *)NULL ){
*found = '\0';
ppData[cnt] = target;

found ++;
target = found;
cnt ++;
}
else{
ppData[cnt] = target;
}
}while( found != (char *)NULL );
}

return ppData;
}
</pre>---



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧