2012-09-11 27 views

Trả lời

11

Không sử dụng atof. Thay vào đó, sử dụng strtod, từ <cstdlib>, và cũng kiểm tra errno từ <cerrno>:

// assume: "char * mystr" is a null-terminated string 

char * e; 
errno = 0; 
double x = std::strtod(mystring, &e); 

if (*e != '\0' || // error, we didn't consume the entire string 
    errno != 0) // error, overflow or underflow 
{ 
    // fail 
} 

Con trỏ e điểm một quá khứ nhân vật tiêu thụ cuối cùng. Bạn cũng có thể kiểm tra e == mystr để xem liệu có bất kỳ ký tự nào đã được sử dụng hay không.

Ngoài ra còn có std::wcstod để làm việc với wchar_t -strings, từ <cwstring>.

Trong C++ 11 bạn cũng có std::to_string/std::to_wstring, từ <string>, nhưng tôi tin rằng sẽ ném ngoại lệ nếu chuyển đổi không thành công, có thể không phải là chế độ thất bại mong muốn khi xử lý dữ liệu ngoài.

+0

@TerranceCohen: Không. (Nhưng bạn vẫn có thể muốn kiểm tra 'errno' để nắm bắt và tràn.) –

1

Sử dụng atof, bạn không thể. Nhưng vì đây là C++, tôi đề nghị bạn sử dụng một std::stringstream và kiểm tra nó với operator ! sau khi áp dụng operator >> đến một double.

Các vấn đề liên quan