0

これに問題があります...コンパイルはしますが、実行するとすぐにセグメンテーション違反が発生します... GDBを使用して、ロングダブルを開始しようとしているときにセグメンテーション違反を起こすと判断しました。atoi は使用する関数が間違っているように感じますが、他の同様の関数を試しても segfault が発生しました。

int main(int argc, char *argv[]) {
  long double x = atoi(argv[1]);
  char oper = argv[2][0];
  long double y = atoi(argv[3]);
4

3 に答える 3

4

atoi()「ascii to integer」の略で、これはあなたが望むものではありません。適切な関数を使用する必要があります —strtold(3)が最も適切ですが、おそらくも使用sscanf(3)できます。

于 2013-01-27T20:58:44.103 に答える
2

文字列を a に変換する正しい方法は次のとおりlong doubleです。

long double strtold(const char *nptr, char **endptr);
于 2013-01-27T20:58:46.217 に答える
2

使用strtold:

#include <stdlib.h>
#include <errno.h>

char * e;
errno = 0;
long double d = strtold(argv[1], &e);

if (*e != 0 || errno != 0) { /* Error! Do not consume the result. */ }

// result now in "d"

の値を使用して*e、文字列の一部が消費されたかどうかを確認できます。詳細はマニュアルを参照してください。私の例では、文字列全体を解析できるかどうかを確認するだけです。

スレッドセーフな解決策があるかどうかは実際にはわかりません...errno (スレッドローカルであるため、そうだと思います。)

于 2013-01-27T21:00:22.160 に答える