質問
多項式の係数をchar配列からint配列に入れようとしています
これがあります:
char string [] =" -4x ^ 0 + x ^ 1 + 4x ^ 3-3x ^ 4&quot ;;
そしてスペースでトークン化することができます
-4x ^ 0
x ^ 1
4x ^ 3
3x ^ 4
したがって、-4、1、4、3をint配列に取得しようとしています
int *coefficient;
coefficient = new int[counter];
p = strtok(copy, " +");
int a;
while (p)
{
int z = 0;
while (p[z] != 'x')
z++;
char temp[z];
strncpy(temp[z], p, z);
coefficient[a] = atoi(temp);
p = strtok(NULL, " +");
a++;
}
ただし、char *をcharに変換できないというエラーが表示される on strncpy(temp [z]、p、z);
error: invalid conversion from ‘char’ to ‘char*’
error: initializing argument 1 of ‘char* strncpy(char*, const char*, size_t)’
これを行う最良の方法は何ですか?
解決
これ:
strncpy(temp[z], p, z);
必要性:
strncpy(temp, p, z);
ただし、 strncpy
が必ずしも文字列をnullで終了するとは限らないことに注意してください。
また、 z
は係数の長さになりますが、ヌルターミネータ用にバッファに余分なバイトが必要です。
更新:
リンクを調べても、まだいくつかの深刻な問題があります:
- "-"は使用できません。
strtok
で" -4x"の1つを取得するためです。必要なものだけでなく。スペースでのみ分割し、+ /-演算子をトークンとして処理する必要があると思います。 -
strncpy
関数は、文字列を終了させないままにします。これにより、atoi
がクラッシュしたり、間違った値がランダムに与えられたりする可能性があります。慣用的な形式の1つは、ターミネーターを手動で記述することです(例:temp [z] = '\ 0'
)。 - 出力値が得られないのは、
a
が初期化されていないため、coefficient [a] =
がランダムメモリに書き込んでいるためです。
他のヒント
char
を strncpy
に渡しています:
strncpy(temp[z], p, z);
最初の引数は、単一の char
ではなく、 char *
ポインターでなければなりません。おそらくあなたがすることは:
strncpy(temp, p, z);
他の人は、temp [z]ではなくtempにstrncpy()することについて正しいです。
自由変数の指数もキャプチャすることをお勧めします。暗黙の「0x ^ 2」を観察します;あなたが無視しているように見える用語。次のステップがxのさまざまな値について多項式を評価する(または、さらに悪いことにソルバーを実行する)場合、それらのべき乗を知る必要があります。
この種のソリューションは十分に簡単に作成できますが、余分な空白、空白の欠落、および複数の演算子と変数名を処理するのに十分な幅があることを証明するために、この種の戦略はますます複雑で困難になります(特に必要な場合)解析が失敗した場合に意味のあるエラーメッセージが表示されます)。
私には、boost.regex(または、タスク全体で操作の順序を分析する必要がある場合はboost.spiritを使用)を使用してこれらの種類の構文を簡単に処理できる防弾ソリューションを実装する方が簡単だと思われます許容度。