2012-10-18 38 views
7

Tôi tìm thấy mã này trực tuyến dưới dạng mẫu để thực hiện chuỗi để chuyển đổi float/int/double. Nó chỉ ở đây vì vậy tôi có một cái gì đó để tham khảo cho câu hỏi ....Chuỗi để nổi bằng cách sử dụng chuỗi

Tôi muốn người dùng nhập một số dưới dạng chuỗi, chuyển nó thành phao, kiểm tra thành công và thoát ra nếu mục nhập là ' Q 'hoặc in "Không hợp lệ đầu vào" nếu nó không phải là' nhân vật Q'uit và trở lại cho đầu vào nhiều hơn nữa.

Cú pháp cho một chuyển đổi không thành công là gì? Nó sẽ là ss.fail()?

// using stringstream constructors. 
#include <iostream> 
#include <sstream> 
using namespace std; 

int main() { 

    int val; 
    stringstream ss (stringstream::in | stringstream::out); 

    ss << "120 42 377 6 5 2000"; 

    /* Would I insert an 

    if(ss.fail()) 
     { 
     // Deal with conversion error } 
     } 

    in here?! */ 


    for (int n=0; n<6; n++) 
    { 
    ss >> val; 
    cout << val*2 << endl; 
    } 

    return 0; 
} 
+0

gì lỗi cú pháp bạn đang nhận được? –

Trả lời

9

Mã của bạn không hữu ích. Nhưng nếu tôi hiểu bạn làm đúng như thế này

string str; 
if (!getline(cin, str)) 
{ 
    // error: didn't get any input 
} 
istringstream ss(str); 
float f; 
if (!(ss >> f)) 
{ 
    // error: didn't convert to a float 
} 

Không cần phải sử dụng không thành công.

2

Trên thực tế, cách đơn giản nhất để làm chuỗi nổi chuyển đổi có lẽ là boost::lexical_cast

#include <string> 
#include <boost/lexical_cast.hpp> 

int main() { 
    std::string const s = "120.34"; 

    try { 
     float f = boost::lexical_cast<float>(s); 
    } catch(boost::bad_lexical_cast const&) { 
     // deal with error 
    } 
} 

Rõ ràng, trong hầu hết trường hợp, bạn chỉ không bắt ngoại lệ ngay lập tức và để cho nó bong bóng lên chuỗi cuộc gọi, vì vậy chi phí giảm nhiều.

0

Một số các tính năng theo yêu cầu của câu hỏi ban đầu là:

  1. ra hai lần so với giá trị của đầu vào nổi
  2. báo cáo đầu vào không hợp lệ
  3. tiếp tục tìm kiếm nổi ngay cả sau khi gặp phải đầu vào không hợp lệ
  4. dừng lại sau khi nhìn thấy ký tự 'Q'

Tôi nghĩ mã sau đáp ứng abo đã yêu cầu:

// g++ -Wall -Wextra -Werror -static -std=c++11 -o foo foo.cc 

#include <iostream> 
#include <sstream> 

void run_some_input(void) 
{ 
    std::string  tmp_s; 

    int not_done = 1; 

    while(not_done && getline(std::cin, tmp_s)) 
    { 
     std::stringstream ss; 

     ss << tmp_s; 

     while(! ss.eof()) 
     { 
      float tmp_f; 
      if (ss >> tmp_f) 
      { 
       std::cout << "Twice the number you entered: " 
          << 2.0f * tmp_f << "\n"; 
      } 
      else 
      { 
       ss.clear(); 
       std::string tmp_s; 
       if(ss >> tmp_s) 
       { 
        if(! tmp_s.compare("Q")) 
        { 
         not_done = 0; 
         break; 
        } 
        std::cout << "Invalid input (" << tmp_s << ")\n"; 
       } 
      } 
     } 
    } 
} 

int main(int argc __attribute__ ((__unused__)), char **argv __attribute__ ((__unused__))) 
{ 
    run_some_input(); 
} 

Dưới đây là một phiên mẫu:

$ ./foo 
1 
Twice the number you entered: 2 
3 4 
Twice the number you entered: 6 
Twice the number you entered: 8 
5 bad dog Quit 6 8 Q mad dog 
Twice the number you entered: 10 
Invalid input (bad) 
Invalid input (dog) 
Invalid input (Quit) 
Twice the number you entered: 12 
Twice the number you entered: 16 
Các vấn đề liên quan