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

时间:2017-06-01 09:36:25

标签: c

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

$data = array();

        print_r($_POST);

        if($_POST){
                $result=$this->User->validate($this->input->post());

                //print_r($result);

                if(!empty($result)){
                    $data=[
                    'id'=> $result[0]['id'], 
                    'username'=>$result[0]['username']
                    ];

                    //print_r($data);

                    $this->session->set_userdata($data);
                    redirect(base_url('dashboard/index'));
                }else{
                    $this->session->set_flashdata('flash_data', 'Username or password is incorrect!');
                    redirect(base_url('login/index'));
                }
        }   

        $page='login';
        if (!file_exists(APPPATH.'views/'.$page.'.php')){
                    show_404();
        }
        $this->load->view($page);

     }

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

  • 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; } 不是好事。
  • "Hello world 20.12312"没问题。

在第一个例子中,我想返回NULL,“false”,任何不是double的东西,所以调用"20.12312"的函数会知道字符串有问题。

有没有优雅的方法来做到这一点?或者在这种情况下convert_to_double不是一个好的解决方案,我需要考虑别的什么?

3 个答案:

答案 0 :(得分:3)

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

double somevar;
char *input;
if (!cast_to_double(input, &somevar)) {
    printf("Bad input %s\n", input);
}

然后你可以像这样使用它:

MariaDB [test]> SELECT JSON_ARRAY_APPEND(JSON_ARRAY(''), '$', JSON_EXTRACT('{"test":123}', '$'))\G
*************************** 1. row ***************************
JSON_ARRAY_APPEND(JSON_ARRAY(''), '$', JSON_EXTRACT('{"test":123}', '$')): ["", {"test": 123}]
1 row in set (0.00 sec)

答案 1 :(得分:0)

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

解决方案1 ​​

int ok;
double value = convert_to_double(str, &ok);
if (!ok)
{
  // argh! COnversion failed
}

这样打电话:

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
}

解决方案2

double value;
if (!convert_to_double(str, &value))
{
  // argh! COnversion failed
}

这样打电话:

{{1}}

答案 2 :(得分:0)

您的函数返回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

这样你可以检查返回值,并像往常一样将字符串作为双精度。