2016-10-01 9 views
1

この問題は文字列を解析するのに役立ちます。文字列を解析するとゴミが出る

私はCフィールドから来たものではありませんので、私がしているばかげたことに気をつけてください。

私はこれを持っている:

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

char DataIn[65] = "WV,000B,404C494748543B."; 

int main() 
{ 
    char *p = DataIn; 

    puts(DataIn); 

    for (int count = 0;count<2 ; ++count) { 
     p = strstr(p, ","); 
     if (!p) 
      break; 
     p++;    
    } 

    char *endPointer = strchr(p, '.'); 
    *endPointer = '\0'; 

    puts(p); 
} 

私はこの例から必要な出力である:404C494748543B(異なる長さを有することができます)。

私は通常そのOK、時には、は一度だけしばらくpを印刷するとき、私はこれを取得:

404C494748543B 
X 
@LIGHT; 
�� 
@LIGHT; 

    ��03 

+ゴミいくつかの以前のデータを含んでいます。

データを抽出する方法に問題がありますか?

+0

どの入力がゴミを生成していますか? –

+1

[最小限の完全で検証可能な例](http://stackoverflow.com/help/mcve)を投稿してみませんか? – MikeCAT

+0

'p = strstr(p、"、 ");' - > 'p = strstr(prev、"、 ");' ... print prev。 – BLUEPIXY

答えて

2

ほとんどの場合、ほとんどの場合は動作しますが、ごみを取得する場合は未定義の動作です。これは、DataInが無効なメモリを指していることを意味します。つまり、割り当てが解除されているか、動作を終了した関数のスタックに割り当てられています。

この問題を診断して解決する最善の方法は、valgrindなどのメモリプロファイラでコードを実行することです。

注:あなたのループが終了したときに、2つの状況があります。

  • countは、2(通常の終了)に達した、または
  • p
(休憩時間に) NULLに設定されています

endPointerを検索するコードは、pがチェックなしでNULLではないと仮定しているため、プログラムがクラッシュする可能性があります。ループがbreakで終了したとき。

+0

ありがとう、私はpをチェックする必要があることを知っているが、その時点で私はそのDataInが有効であることを見ることができ、私が探しているすべての文字を持っているクラッシュを取得する。 – Curnelious

+0

@Curnelious valgrindで実行すると、コードがゴミを印刷しなくてもすぐに問題を指摘します。 – dasblinkenlight

+0

このコードはチップ上にあるので、私は利用可能なツールをすべて持っていません。しかし、DataInがどのように有効であり、カンマを検索して見つけられないのか、あなたは説明できますか?私はそれを印刷して、それが有効であることを確認することができます。 – Curnelious