gpt4 book ai didi

C++ String to Double 解析异常?

转载 作者:搜寻专家 更新时间:2023-10-30 23:49:46 25 4
gpt4 key购买 nike

在 java 中,如果我想创建一些可以接收 double 和字符串作为适当输入的应用程序,我可能会执行以下操作:

String input = getInput();//
try {
double foo = Double.valueOf(input);
//Do stuff with foo here
} catch (NumberFormatException e) {
//Do other validation with input
}

你会如何在 C++ 中做到这一点? atof()对于无效输入返回 0.0,但是您如何将其与有效的双倍“0.0”区分开来?顺便说一句,我只能包括 <iostream> , <string> , <cstdlib> , 和 <cassert>在这个项目中。我假设我需要使用 cin以某种方式,但是如何在 cin 之后获取原始输入?无法将某些字符串解析为 double ?

编辑:我可能会使用以下内容,但正如我之前所说,我不允许导入 <sstream>由于某种原因在这个任务上

string input;
getline(cin, input);

double x;
istringstream foo(input);
foo >> x
if(cin){
//do manipulations with x
}
else{
//since it's not a number, check if input is a valid command etc..
}

最佳答案

异常(exception)情况应保留。虽然您当然可以像这样滥用它们,但这是一个糟糕的想法 - 显然您非常期待 double 以外的东西,因此将其视为异常(exception)没有任何实际意义。

唯一真正的问题是您希望将输入视为字符串的确切情况。例如,如果输入字符串类似于“1.23e2 非数字数据”,您是只想将“1.23e2”用作数字,还是将整个字符串视为一个字符串?

无论哪种方式,您都希望我们使用 strtod 进行转换——区别仅在于您对返回值的 react 方式。特别是,strtod 采用两个 参数,而不是像atof 那样只采用一个参数。第二个参数是指向 char 的指针。假设您传递了一个非 NULL 指针,strtod 会将其设置为指向它成功转换的输入字符串中的最后一个字符。如果它指向输入字符串的开头,则没有任何内容被转换。如果指向末尾,则一切都已转换。如果它介于两者之间,则部分字符串已转换,部分未转换。

目前,我假设您想要一个 double 值,其中包含字符串开头可以转换的任何数字,以及将无法转换的任何数字视为字符串:

#include <stdlib.h>
#include <stdio.h>

int main() {
char input[] = "12.34 non-numeric data";
char *string;
double value = strtod(input, &string);

printf("Number: %f\tstring: %s\n", value, string);
return 0;
}

关于C++ String to Double 解析异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3640308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com