[解決済み] 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);
関連
-
[解決済み】ISO C90では、C言語での宣言とコードの混在が禁止されています。
-
[解決済み】ポインタへの代入時に互換性のないポインタ型からの初期化警告が発生した
-
[解決済み】Cygwin - Makefile-error: ターゲット `main.o' のレシピに失敗しました。
-
[解決済み】ヒープ割り当てで初期化されていない値が作成された
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み] 文字列をfloatやintにパースするにはどうしたらいいですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] JSON文字列を安全にオブジェクトに変換する
-
[解決済み] UnixツールでJSONをパースする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。
-
[解決済み】 `S_ISREG()` とは何ですか、そして何をするのですか?
-
[解決済み] Connect: ソケット以外でのソケット操作
-
[解決済み】組み込み関数「malloc」の暗黙の宣言の非互換性
-
[解決済み】式は、単純なポインタ演算を使用して完全なオブジェクト型へのポインタでなければなりません【重複】。
-
[解決済み】C言語で入力が整数型かどうかチェックする
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】Linuxソケットのwrite()でBad File Descriptorが発生するC