2017-05-27 3 views
0

strtokに渡して値を印刷しようとすると、 str="insert 111,name,123456789" の文字列がある場合、それらは逆に出力されます。たとえば :printf()の値としてstrtok()を逆に返します。

の代わり
char* token=strtok(str," "); 
printf("%s %s %s %s\n",token,strtok(NULL,","),strtok(NULL,","),strtok(NULL,",")); 
output: insert 1234567 name 1111 

insert 111 name 123456789 ですが、なぜでしょうか?どのようにこれを修正することができますか?

+3

引数の評価順序が定義されていません。引数に副作用( 'strtok'を呼び出すようなもの)のコードを使用しないでください。 –

+1

おそらく、*シーケンスポイント*エラーのために、*不確定にシーケンスされた*結果が発生している可能性があります。パラメータ評価の順番には保証がありません。 ** C11 Standard Sect。 6.5.2.2(10)** –

+0

どのように修正できますか?慣用的な 'while(token!= NULL)'ループを使用してください。 'strtok'への呼び出しの1つが' NULL'を返すべきであれば、もう一度呼び出すべきではないので、あなたのバージョンもひどいです。入力データに頼らないでください。 –

答えて

1

パラメータがコールコンベンションオーダーでスタックにプッシュされます。この場合、逆の場合があります。したがって、パラメータ5が最初に評価されてスタックにプッシュされ、次に4,3,2およびフォーマット文字列がプッシュされます。

これまでに多くのコメントがありましたが、あなたのコールスタイルは避けてください。 を避けてください。

+0

そして、レジスタによって渡される 'x86_64'パラメータに関しては、どうすればうまくいくのでしょうか? (整数引数とその他の引数を区別する必要があります) –