1. ホーム
  2. c

[解決済み] strsepを使ったC言語の文字列解析(代替方法)

2022-03-04 08:05:55

質問

文字列をパースしたいので strsep 関数を使用します。

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

int main()
{

  char str[] = "Marco:Q:2F7PKC";
  char *token1, *token2, *token3;
  char *r = malloc(30);

  strcpy(r, str);

  token1 = strsep(&r, ":");
  token2 = strsep(&r, ":");
  token3 = strsep(&r, ":");

  printf("tok1 = %s\n", token1);
  printf("tok2 = %s\n", token2);
  printf("tok3 = %s\n", token3);

  free(r);

  return 0;

}

この関数はうまく動作していますが バルグラインド の場合、割り当てられた文字列は char * r が正しく解放されない ( 確実に失われた: 1 ブロックで 30 バイト ).

その理由と、同じことをするための代替方法があれば知りたいです。 ストリップ .

でvalgrindを呼び出しています。 valgrind --tool=memcheck --leak-check=full --show-reachable=yes ./a.out

どのように解決するのですか?

strsep は最初の (ポインタからポインタへの) 引数のターゲットを上書きするので、そのポインタは失われます。 malloc d バッファのベースとなる。実際、もしあなたが printf("%p\n", r); の直前で free の場合、NULLポインタを解放していることがわかりますが、これは何の効果もありません。

簡単な解決策は、そのポインタを保持するために追加の変数を導入し free を使用します。慣用的な使い方は次のとおりです。

char *r = strdup("Marco:Q:3F7PKC");
// check for errors

char *tok = r, *end = r;
while (tok != NULL) {
    strsep(&end, ":");
    puts(tok);
    tok = end;
}

free(r);