C ++:检查非数字输入并分配给double

时间:2010-06-09 22:34:54

标签: c++

这是我目前的代码:

char ch;
int sum = 0;
double values[10];
int i = 0;
cin >> ch;
    while (!isalpha(ch))
    {  
        values[i] = ch; 
        sum += values[i]; 
        i++;  
        cin >> ch;
    }

发生的事情是,如果我输入值1,则将其作为char分配给ch。现在ch将它的值赋给double并进行隐式转换。因此它将ASCII值“1”赋给值[i]。我希望它只为值[i]分配1。有一个更好的方法吗?或者有什么东西我不见了?

4 个答案:

答案 0 :(得分:3)

如果您想将数字字符转换为相应的数字值,您只需从中减去'0'

char ch = '2';
int value = ch - '0'; // value is 2

但是,读取浮点数的最佳方法是从double中提取cin

double value = 0;
if (cin >> value)
{
    // value is good
}
else
{
    // invalid value was entered; handle the error appropriately
}

请注意,如果提取失败并且您想继续从流中读取,则需要调用cin.clear()来清除流的失败状态,您可能需要调用cin.ignore()来忽略任何尾随字符(例如,如果您使用基于行的输入,则在下一个换行符之前,您需要忽略所有内容)。

答案 1 :(得分:1)

将整个数字作为字符串读取,并使用double函数或其他一些特定于C ++的方法将整个数据转换为strtod

答案 2 :(得分:1)

虽然这不是一个好的解决方案,但在分配数组元素时,您可以在技术上从char变量中减去“0”的ASCII代码:

char ch;
int sum = 0;
double values[10];
int i = 0;
cin >> ch;
while (!isalpha(ch))
{  
    values[i] = ch - '0'; 
    sum += values[i]; 
    i++;  
    cin >> ch;
}

如果ch是一个数字(0-9),则ch-'0'会以“int”形式给出数字ch({0'在ASCII table中为dec48,数字0为0 9从dec48到dec57)。

虽然这有点像黑客,但可能不应该使用,但是,这是一个可能的解决方案。

答案 3 :(得分:0)

字符串流应该能够为你做转换。通过atoi也可以完成工作。