C言語関係掲示板

過去ログ

No.1035 "aa,bb,cc,,,dd"の分解

[戻る] [ホームページ]
No.13260

文字列の分割
投稿者---初心者(2004/03/22 00:59:22)


文字列の分割についてお伺いしたいのですが

データ
chara *str = "aa,bb,cc,,,dd";

をカンマ区切りでそれぞれ別バッファに格納したいのですが
普通strtokを使用すれば良いのですが
カンマの前の文字列がない場合もバッファにNULLを格納したいのですが
どのように処理していいのかわかりません。
どなたかご教授お願い致します。


No.13261

Re:文字列の分割
投稿者---RAPT(2004/03/22 02:20:30)


ってもはやFAQだな。
ってことで、サンプルソース(半年前に作成)をコピペ。

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


char *tokenize(char *str, const char sep)
{
  static char *token = NULL, *ptr = NULL;
  if( str != NULL )
    ptr = str;
  token = ptr;

  while( *ptr && *ptr != sep )
    ++ptr;
  if( *ptr )
    *ptr++ = '\0';
  return token;
}


int main()
{
  int i, count;
  char strBuff[] = "aaa:bbb:ccc:ddd::fff";
  char s[10][10] = {0};
  char *tok = NULL;
  const char sep = ':';

  tok = tokenize(strBuff, sep);
  for( count = 0;  count < 10 && tok != NULL; ++count){
    strncpy(s[count], tok, 9);
    tok = tokenize(NULL, sep);
  }
  for( i = 0; i < count; ++i){
    printf("%d : %s\n", i, s[i]);
  }

  return 0;
}


No.13263

Re:文字列の分割
投稿者---かずま(2004/03/22 20:59:22)


> chara *str = "aa,bb,cc,,,dd";
> 
> をカンマ区切りでそれぞれ別バッファに格納したいのですが
> 普通strtokを使用すれば良いのですが
> カンマの前の文字列がない場合もバッファにNULLを格納したいのですが
> どのように処理していいのかわかりません。

chara ではなく、char ですね。
NULL の代わりに、"" を格納するプログラムを示します。

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

void buf_add(char **p, const char *s, int len)
{
    *p = malloc(len + 1);
    if (*p == NULL) puts("out of memory"), exit(1);
    memcpy(*p, s, len);
    (*p)[len] = '\0';
}

int main(void)
{
    char *str = "aa,bb,cc,,,dd";
    char *buf[16], *p1, *p2;
    int  i, n = 0;

    for (p1 = str; n < 16 && (p2 = strchr(p1, ',')); p1 = p2 + 1)
        buf_add(&buf[n++], p1, p2 - p1);
    buf_add(&buf[n++], p1, strlen(p1));

    for (i = 0; i < n; i++) printf("buf[%d]='%s'\n", i, buf[i]);

    /* for (i = 0; i < n; i++) free(buf[i]); */
    return 0;
}


どうしても、NULL にしたいのなら、buf_add() の先頭に

    if (len == 0) { *p = NULL; return; }
	
を追加してください。


No.13264

Re:文字列の分割
投稿者---かずま(2004/03/22 21:32:04)


> NULL の代わりに、"" を格納するプログラムを示します。
buf[16] に書き込んでしまう場合があるというバグがありますね。
とりあえず次のように訂正しておきます。

#define N  16

    char *buf[N], *p1, *p2;

    for (p1 = str; n < N-1 && (p2 = strchr(p1, ',')); p1 = p2 + 1)


No.13265

Re:文字列の分割
投稿者---初心者(2004/03/22 23:11:24)


RAPT様
かずま様
ありがとうございました。
参考にさせて頂きます。