2008-10-14 72 views
45

Possible Duplicate:
How to parse a string to an int in C++?Làm cách nào để chuyển đổi chuỗi C++ thành int?

Làm cách nào để chuyển đổi chuỗi C++ thành int?

Giả sử bạn đang mong đợi chuỗi có số thực trong đó (ví dụ: "1", "345", "38944").

Ngoài ra, giả sử bạn không có tăng, và bạn thực sự muốn làm điều đó theo cách C++, không phải cách cũ C crufty.

+13

Làm thế nào về một số ví dụ sau đây: http://www.codeproject.com/KB/recipes/Tokenizer.aspx Chúng rất hiệu quả và phần nào thanh lịch. –

Trả lời

33

Sử dụng luồng C++.

std::string  plop("123"); 
std::stringstream str(plop); 
int x; 

str >> x; 

/* Lets not forget to error checking */ 
if (!str) 
{ 
    // The conversion failed. 
    // Need to do something here. 
    // Maybe throw an exception 
} 

PS. Nguyên tắc cơ bản này là cách thư viện tăng cường lexical_cast<> hoạt động.

phương pháp ưa thích của tôi là thúc đẩy lexical_cast<>

#include <boost/lexical_cast.hpp> 

int x = boost::lexical_cast<int>("123"); 

Nó cung cấp một phương pháp để chuyển đổi giữa một chuỗi và định dạng số và ngược lại. Bên dưới nó sử dụng một chuỗi chuỗi để bất cứ thứ gì có thể được sắp xếp thành một luồng và sau đó un-marshaled từ một dòng (Hãy xem các toán tử >> và < <).

+0

không nên là "if (! X) ..."? – Svante

+4

Không. Nếu toán tử luồng không trích xuất một số từ str, nó sẽ đặt bit xấu. Sử dụng điều này trong một bối cảnh boolean (như trên) sẽ kiểm tra xem luồng có OK hay không bằng cách trả về một đối tượng có thể chuyển đổi thành bool. Nếu tôi thử nghiệm 'x' thì nó sẽ thất bại nếu giá trị được đặt trong 'x' là 0. Nếu luồng không trích xuất được bất kỳ giá trị nào của 'x' là không xác định. –

+1

Nó đặt bit _fail_, không phải là bit _bad_. nhà điều hành! là một từ đồng nghĩa với fail(). – scai

0

Sử dụng atoi

+0

Không phải đặc biệt là C++? Ngay cả std :: atoi không thực sự là C++ ... –

+2

atoi() thực hiện phép thuật khác ... như bỏ qua khoảng trống phía trước, bỏ qua dấu cách không dấu cách và giả sử "0" cũng là một điều kiện lỗi hợp lệ. Vui lòng chỉ sử dụng atoi() khi bạn thực sự không quan tâm đến tính hợp lệ. Nếu không, strtod() trong C và std :: istringstream trong C++. –

72
#include <sstream> 

// st is input string 
int result; 
stringstream(st) >> result; 
+3

Điều gì sẽ xảy ra nếu có lỗi? Nói chuỗi không có số trong đó ("hello!" Thay vì "5"). – krupan

+20

Sau đó, bạn kiểm tra lỗi: (chuỗi kết nối (st) >> kết quả)? cout << kết quả: cerr << "Bạn thua"; –

-6

trong "stdapi.h"

StrToInt 

Chức năng này cho bạn biết kết quả, và có bao nhiêu nhân vật tham gia vào việc chuyển đổi.

+2

Huh? Googling cho điều này "stdapi.h" không bật lên bất cứ điều gì. Bạn có nghĩa là "shlwapi.h" (đó là Windows cụ thể, một phần của DLL vỏ, và tương đương với cách C cũ crufty)? – bk1e

4

Tôi đã sử dụng một cái gì đó như sau trong C++ mã trước:

#include <sstream> 
int main() 
{ 
    char* str = "1234"; 
    std::stringstream s_str(str); 
    int i; 
    s_str >> i; 
} 
+1

OK. Ai đó đã đề xuất điều này, vì vậy tôi đã tăng cường. – ayaz

0

Có lẽ tôi hiểu lầm câu hỏi, bởi lý do tại sao chính xác bạn sẽ không muốn sử dụng atoi? Tôi không thấy điểm nào trong việc phát minh lại bánh xe.

Tôi có bị thiếu điểm ở đây không?

+0

Trang hướng dẫn sử dụng cho atoi() nói, "Hàm atoi() được gộp bởi strtol() nhưng được giữ lại bởi vì nó được sử dụng rộng rãi trong mã hiện có. Nếu số không được biết là nằm trong phạm vi, strtol() phải là được sử dụng vì atoi() không bắt buộc phải thực hiện bất kỳ kiểm tra lỗi nào. " – krupan

+0

Tôi mặc dù atoi() là không chuẩn, do đó không có sẵn ở khắp mọi nơi. Có thể là sai mặc dù. –

+0

Đó là một điểm tuyệt vời, Krupan. Tôi thừa nhận tôi đã không nghĩ về điều đó. – user12576

2

Hãy để tôi thêm phiếu bầu của tôi cho boost :: lexical_cast

#include <boost/lexical_cast.hpp> 

int val = boost::lexical_cast<int>(strval) ; 

Nó ném bad_lexical_cast về lỗi.

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