我遇到了麻烦...它可以编译,但是在运行时会立即出现段错误...使用GDB,我确定它在尝试启动长双打时会出现段错误。我觉得 atoi 可能是使用错误的函数,但我尝试了其他类似的函数,但仍然出现段错误。
int main(int argc, char *argv[]) {
long double x = atoi(argv[1]);
char oper = argv[2][0];
long double y = atoi(argv[3]);
我遇到了麻烦...它可以编译,但是在运行时会立即出现段错误...使用GDB,我确定它在尝试启动长双打时会出现段错误。我觉得 atoi 可能是使用错误的函数,但我尝试了其他类似的函数,但仍然出现段错误。
int main(int argc, char *argv[]) {
long double x = atoi(argv[1]);
char oper = argv[2][0];
long double y = atoi(argv[3]);
atoi()
代表“ascii to integer”,这不是你想要的。您应该使用适当的功能 —strtold(3)
是最合适的,但您也可以使用sscanf(3)
。
将字符串转换为 a 的正确方法long double
是
long double strtold(const char *nptr, char **endptr);
使用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
是线程本地的。)