2016-09-27 13 views
0

私はすでにC言語でこのコードを持っています。カンマで区切られた15個のデータの文字列です。コードはカンマで区切り、すべてのデータを配列[]という単一変数に格納します。最後のカンマの後にデータがない場合、変数x15 = 0が最後のデータコンマを持っていますが、最後の値の後に値がある場合は、その値をintに変換します。検証する配列[15]の値を出力します。これはnullです。そのための条件はありますが、うまくいきません。プログラムはコンパイルした後にブレークします。C言語でのヌル比較

char buf[] ="¶bL0 L3,01,+08590323,-079343001,010215,00000000000000,-tN,000,012689997,001219456,000,7FF2,C07F,0,4,"; 

printf("\n \n string=[%s]\n\n", buf); 
int i = 0; 
int u; 
char *p = strtok (buf, ","); 
char *array[16]; 
char *y15; 
while (p != NULL) 
{ 
    array[i++] = p; 
    p = strtok (NULL, ","); 
} 

for (i = 0; i <16; ++i){ 
     if(array[15] == NULL){ 
      wbt.x15=0; 
     }else{ 
     wbt.x15=atoi(array[15]); 
     } 

//printf("data: [%s]\n", array[i]); 
} 
+0

char *array[16] = {0}; 

また、私はあなたのforループのようなものにする必要があると思いますか?何らかの理由で段落が存在します。 – nbro

+0

なぜ、妥当なブレークポイントを設定しない、e。 g。 'for'ループの始めに、' array'のウォッチとともに、そしてプログラムの実行をステップ実行しますか?あなたは配列の値がどのように変化するかを見ています。 – Jireugi

+0

コンパイル後にプログラムが壊れました...プログラムをコンパイルしたらどうしましたか?プログラムは単にコンパイルした後でも、脳にぶつかったり、書き込んだりすることもありません。しかし、プログラムをコンパイルしても、自発的に破損することはありません。 –

答えて

1

未定義の動作の原因となる、初期化されていない配列要素を使用しています。

あなたが持っている:配列の

char *array[16]; 

要素が初期化されていません。

if(array[15] == NULL){ 
    wbt.x15=0; 
    }else{ 
    wbt.x15=atoi(array[15]); 
    } 

ループの繰り返しごとにそのチェックがあるのはなぜわかりませんが、それは別の問題です。投稿されたコードの問題は、array[15]が初期化されていないということです。その値を使うことは問題です。

arrayを正しく初期化してください。用途:あなたがあなたの質問を書き換えることができます

for (i = 0; i <16; ++i) 
{ 
    int x = 0; 
    if(array[i] != NULL) 
    { 
     x = atoi(array[i]); 
    } 

    // Now use x. 
} 
+1

配列が 'while/strtok'ループで構築される方法に基づいて、' for'ループはnullで終了するはずです。 'if(array [i] == NULL)break;' –

+0

ありがとう、あまりにも、単純な配列の初期化。我々はプログラミングで学ぶ毎日、基本的な事柄は実際に私たちの頭を壊すことができます。 –

+0

@CraigEstey、同意します。 –