-3

私は文字列を取得しました。その中には次のものがあります。

2@0.88315@1@1.5005@true@0.112そしてそれは続く...

2 以上のすべての数値を 1 に切り替える必要があるため、次のように記述しました。

for (i = 0 ; i < strlen(data) ; i++)
{
    if (data[i] >= 50 && data[i] <= 57) // If it's a number
    {
        data[i] = '1'; // switch it to one
        while (data[i] >= 48 && data[i] <= 57)
        {
           i++;
        }
     }
 }

問題は、0.051511 のような数値を 1.111111 としても作成することです... double を 1 つの数値として見なすのではなく、すべての数値を別々に見なすためです... どうすればできますか? ありがとう

4

3 に答える 3

3

不明なため、質問を明確にするために、次の入力が必要です。

"2@0.88315@1@1.5005@true@0.112"

次のように変更します。

"1@0.88315@1@1@true@0.112"

問題は、あらゆる種類の比較を行うために、各数値をfloat値に解析する必要があることです。これか、「。」をチェックして手動で解析する必要があります。キャラクター。C標準ライブラリはあなたを助けることができる関数を提供するので、それを手動で行うことは厳格で、エラーが発生しやすく、不必要です。

これは宿題なので、実際の解決策ではなく、この問題に取り組む方法についていくつかのヒントを紹介します。あなたがすべきことは、これらのステップで解決策を書いてみることです。行き詰まった場合は、書いたコードで元の質問を編集してください。失敗している場所と、失敗していると思う理由を説明してください。

最初のステップは、入力を次のようにトークン化することです。

"2"
"0.88315"
"1"
"1.5005"
"true"
"0.112"

これは、文字列を反復処理して分割するか、ポインタを使用してから「@」文字を使用することで実行できます。文字列の分割は。で行うことができますstrtok。ただし、strtok文字列を変更して文字列を分割します。これは、この場合は必ずしも必要ではありません。より簡単な方法は、文字列を繰り返し処理し、「@」文字に到達するたびに停止することです。次に、入力は次のようにトークン化されます。

"2@0.88315@1@1.5005@true@0.112"
"0.88315@1@1.5005@true@0.112"
"1@1.5005@true@0.112"
"1.5005@true@0.112"
"true@0.112"
"0.112"

これらのサブストリングの一部は、floatを表すストリングで始まりません。それらのどれを行うかを決定する必要があります。これを行うには、各文字列の先頭をフロートとして解析することを試みることができます。これはで行うことができますsscanf。フロートを解析した後、必要な比較を行うことができます。

文字列を別の長さに変更しようとしているため、float値を「1」に置き換える場合は、元の値の長さを確認する必要があります。1文字より長い場合は、後続の文字を前にシフトする必要があります。例えば:

"3.423@1"

最初のトークンを解析して、それがであることがわかった> 2場合は、最初の文字を「1」に置き換えます。この結果は次のようになります。

"1.423@1"

次に、文字列の残りの部分を下にシフトして、そのトークンの残りの部分を削除する必要があります。

"1@1"
于 2012-06-13T18:06:49.107 に答える
0

if ステートメントでacharと anを比較しているようです。int

なぜこれが重要なのかを理解し、それを補う必要があります。

于 2012-06-13T18:03:41.583 に答える
0

文字列内の文字を 1 つずつ比較しています。「@」記号の間のすべてを 1 つの数字と見なす必要がある場合、これは機能しません。これらの数値を配列に取得し、それらを double にキャストしてから、2 と比較してみてください。

于 2012-06-13T18:19:52.923 に答える