C-从函数返回不同的值类型

C-从函数返回不同的值类型,c,C,我编写了以下函数将字符串转换为双精度: double convert_to_double(char *str){ char *remaining_str; double number; number = strtod(str, &remaining_str); /* we want to get only a double as parameter */ if ( strlen(remaining_str) > 0 ) {

我编写了以下函数将字符串转换为双精度:

double convert_to_double(char *str){
    char *remaining_str;
    double number;

    number = strtod(str, &remaining_str);

    /* we want to get only a double as parameter  */
    if ( strlen(remaining_str) > 0 ) {
        return NULL; // something like this
    }

    return number;
}
我想确保函数接受的参数只包含一个double。例如:

  • “Hello world 20.12312”
    不是一个好主意
  • “20.12312”
    正常
在第一个示例中,我想返回NULL,“false”,任何不是double的值,这样调用
convert\u to\u double
的函数就会知道字符串有问题


有什么优雅的方法可以做到这一点吗?或者在这种情况下,strtod不是一个好的解决方案,我需要考虑其他问题。

一个函数只能返回一种类型。如果要同时返回结果和成功指示器,可以通过指针返回其中一个

int cast_to_double(char *str, double *result) {
    char *remaining_str;
    double number;

    number = strtod(str, &remaining_str);

    /* we want to get only a double as parameter  */
    if ( strlen(remaining_str) > 0 ) {
        return 0;
    }

    *result = number;
    return 1;
}
然后你可以这样使用它:

double somevar;
char *input;
if (!cast_to_double(input, &somevar)) {
    printf("Bad input %s\n", input);
}
int ok;
double value = convert_to_double(str, &ok);
if (!ok)
{
  // argh! COnversion failed
}
double value;
if (!convert_to_double(str, &value))
{
  // argh! COnversion failed
}

如果返回值不是指针,则不能返回NULL

int cast_to_double(char *str, double *result) {
    char *remaining_str;
    double number;

    number = strtod(str, &remaining_str);

    /* we want to get only a double as parameter  */
    if ( strlen(remaining_str) > 0 ) {
        return 0;
    }

    *result = number;
    return 1;
}
解决方案1

double convert_to_double(char *str, int *ok){
    char *remaining_str;
    double number;

    number = strtod(str, &remaining_str);

    /* we want to get only a double as parameter  */
    if ( strlen(remaining_str) > 0 ) {
        *ok = 0;   // conversion failed
        return 0;  // we must return something
    }

    *ok = 1;       // conversion OK
    return number;
}
这样称呼:

double somevar;
char *input;
if (!cast_to_double(input, &somevar)) {
    printf("Bad input %s\n", input);
}
int ok;
double value = convert_to_double(str, &ok);
if (!ok)
{
  // argh! COnversion failed
}
double value;
if (!convert_to_double(str, &value))
{
  // argh! COnversion failed
}
解决方案2

int convert_to_double(char *str, double *number){
    char *remaining_str;

    *number = strtod(str, &remaining_str);

    /* we want to get only a double as parameter  */
    if ( strlen(remaining_str) > 0 ) {
        return 0;  // converion failed
    }

    return 1;   // conversion OK
}
这样称呼:

double somevar;
char *input;
if (!cast_to_double(input, &somevar)) {
    printf("Bad input %s\n", input);
}
int ok;
double value = convert_to_double(str, &ok);
if (!ok)
{
  // argh! COnversion failed
}
double value;
if (!convert_to_double(str, &value))
{
  // argh! COnversion failed
}

函数返回一个
double
,而不是
NULL
,它是
void*
((void*)0)

函数只返回1个固定类型的数据。要按所需方式进行处理,可以传递指针参数以检查转换过程,如下所示:

bool success = true;
double value = cast_to_double("My double : 2.3", &success);
if (success)
    ...
然后,您的函数可以修改
bool*success
值。相反的方式可能会更好:

double value = 0;
if (! cast_to_double("My double 3.2", &value))
    // Error

通过这种方式,您可以检查返回值,并像您一样获得双精度字符串。

BTW:您在这里所做的不是“强制转换”,而是“转换”。如果返回值不是指针,则不能返回
NULL
。宏
NULL
用于指针,而不是值。除了空指针外,在C中没有任何方法指示“无值”。您必须找到其他方法,例如传递一个额外的
double*
参数,该参数是指向要分配给的变量的指针,然后返回一个布尔值true或false以指示成功或失败。对于浮点,将有
NaN
s。但这是一个XY问题。由于您已经使用了strtod,因此您的函数非常无用,也不是一个好主意,因为您无法继续正确阅读进一步的输入(您现在可能不想阅读,但请等待接下来的几节课)。您是否阅读了STROD的文档?你明白了吗?您是否考虑过函数参数如何处理的(积极)含义?请注意,
strod()
将跳过前导空格;是否有充分的理由拒绝尾部空白?如果不想使用前导空格,则必须在调用
strod()
之前检查前导空格;如果希望允许尾随空格,则需要进行不同的转换后检查。目前,您的代码将接受一个空字符串作为有效字符串,或者接受一个全空字符串。您应该考虑<代码> int转换子句- double(conchchar string,double * value)< />代码>成功返回0,失败时给出适当的错误指示。在调用它之前,必须先将
errno
设置为
0
,然后检查返回值和
errno
。POSIX规范说明:由于0在出错时返回,并且在成功时也是有效的返回,因此希望检查错误情况的应用程序应该将
errno
设置为0,然后调用
strod()
[…],然后检查
errno
。还有其他错误返回值(±0)。