我从C开始,我必须检查main函数的参数是否为double。我正在尝试使用strtod,但它给了我一些麻烦。所以我的主要看起来像这样:
int main (int argc, char* argv[]){
if (!(strtod(argv[1], NULL)) /*trouble is with this line*/
exit(EX_USAGE);
else{
/*some code*/
}
return(0);
}
我已经使用strtod将argv [1]解析为double(没有问题),但问题是当argv [1]不是double时,所以很明显无法解析它。 有什么想法吗?
答案 0 :(得分:3)
strtod()
有第二个参数,它是一个指向char指针的指针。如果它不是NULL
,它将向该指针写入它停止转换的字符串中的地址,因为其余的不是有效的浮点数表示。
如果整个字符串转换正确,那么显然指针将指向字符串的结尾。转换应该看起来像这样,超出范围检查以获得良好的衡量标准:
char *endptr;
double result;
errno = 0;
result = strtod(string, &endptr);
if (errno == ERANGE) {
/* value out of range */
}
if (*endptr != 0) {
/* incomplete conversion */
}
答案 1 :(得分:2)
strtod用于将string(char数组)转换为double。如果输入无效或输入有效ZERO或输入为空格,则函数返回ZERO。
答案 2 :(得分:0)
你拥有男人所需要的一切:
命名强>
strtod, strtof, strtold - convert ASCII string to floating-point number
<强>概要强>
#include <stdlib.h> double strtod(const char *nptr, char **endptr);
<强>描述强>
The strtod(), strtof(), and strtold() functions convert the ini‐ tial portion of the string pointed to by nptr to double, float, and long double representation, respectively.
返回值
These functions return the converted value, if any. If endptr is not NULL, a pointer to the character after the last character used in the conversion is stored in the location ref‐ erenced by endptr. If no conversion is performed, zero is returned and the value of nptr is stored in the location referenced by endptr.
我发现最后一句话特别有趣。
答案 3 :(得分:0)
这可能很明显,但您没有检查argc
以确保您有一个要解析的参数。你应该做这样的事情:
int main (int argc, char* argv[]) {
if (argc < 2) {
exit(EX_USAGE);
}
double arg1 = strtod(argv[1], NULL);
if (arg1==0 && strcmp(argv[1], "0")!=0) {
exit(EX_USAGE);
}
/* some code */
}