2011-01-20 80 views
23

Thông thường khi tôi viết bất kỳ thứ gì trong C++ và tôi cần chuyển đổi một số char thành int Tôi chỉ cần tạo int mới bằng số char.Chuỗi C++ để chuyển đổi gấp đôi

tôi đã sử dụng mã (đoạn)

string word; 
openfile >> word; 
double lol=word; 

tôi nhận được lỗi đó

Code1.cpp cannot convert `std::string' to `double' in initialization 

không lỗi có ý nghĩa gì chính xác? Từ đầu tiên là số 50. Cảm ơn :)

+0

thể trùng lặp của [String trong khoa học ký hiệu C++ để chuyển đổi kép] (http://stackoverflow.com/questions/1710447/string-in-scientific-notation- c-to-double-conversion) –

+0

Điều này về cơ bản là một bản sao với sự khác biệt duy nhất mà bạn thậm chí không cần phải đi qua giai đoạn chuỗi, vì bạn có thể đọc trực tiếp vào gấp đôi. –

+3

Khi bạn chuyển 'char' thành' int', bạn sẽ nhận được mã của ký tự chứ không phải là "giá trị" của nó. Nói cách khác, 'int x = '0';' đặt 'x' thành' 48' (nếu bạn đang ở miền địa phương tương thích ASCII), không phải '0'. –

Trả lời

42

Bạn có thể chuyển đổi char sang int và ngược lại một cách dễ dàng bởi vì đối với máy một int và một char đều giống nhau, 8 bit, sự khác biệt chỉ đến khi chúng phải được hiển thị trên màn hình, nếu số đó là 65 và được lưu dưới dạng char, thì nó sẽ hiển thị 'A', nếu nó được lưu dưới dạng int, nó sẽ hiển thị 65.

Với những thứ khác thay đổi, bởi vì chúng được lưu trữ khác nhau trong bộ nhớ. Có chức năng tiêu chuẩn trong C cho phép bạn chuyển đổi từ chuỗi thành gấp đôi một cách dễ dàng, đó là atof. (Bạn cần phải bao gồm stdlib.h)

#include <stdlib.h> 

int main() 
{ 
    string word; 
    openfile >> word; 
    double lol = atof(word.c_str()); /*c_str is needed to convert string to const char* 
            previously (the function requires it)*/ 
    return 0; 
} 
14

Vấn đề là C++ là một ngôn ngữ gõ tĩnh, có nghĩa là nếu một cái gì đó được khai báo là string, đó là một chuỗi, và nếu một cái gì đó được khai báo là double, đó là một đôi. Không giống như các ngôn ngữ khác như JavaScript hoặc PHP, không có cách nào để tự động chuyển đổi từ chuỗi thành giá trị số vì chuyển đổi có thể không được xác định rõ. Ví dụ: nếu bạn thử chuyển đổi chuỗi "Hi there!" thành double, thì không có chuyển đổi có ý nghĩa. Chắc chắn, bạn có thể chỉ cần đặt double thành 0.0 hoặc NaN, nhưng điều này gần như chắc chắn sẽ che giấu thực tế rằng có sự cố trong mã.

Để khắc phục điều này, không đệm nội dung tệp vào chuỗi. Thay vào đó, chỉ cần đọc trực tiếp vào double:

double lol; 
openfile >> lol; 

này đọc giá trị trực tiếp như một số thực, và nếu một lỗi xảy ra sẽ gây phương pháp của dòng .fail() trở thành sự thật. Ví dụ:

double lol; 
openfile >> lol; 

if (openfile.fail()) { 
    cout << "Couldn't read a double from the file." << endl; 
} 
+1

Nếu bạn không đọc từ luồng, bạn cần sử dụng hàm để thực hiện chuyển đổi, chẳng hạn như 'atof()' từ ' '. –

+4

@Mike: Là người mới bắt đầu, khi bạn không đọc từ một luồng, nhưng có một chuỗi, bạn cần phải đặt nó vào một chuỗi và đọc từ đó. – sbi

+0

@Mike, cảm ơn. Đó là những gì tôi cần. – TimeCoder

4

Nếu bạn đọc từ một tệp thì bạn nên nghe lời khuyên đưa ra và đặt nó thành gấp đôi.

Mặt khác, nếu bạn có, giả sử, một chuỗi bạn có thể sử dụng số tăng của lexical_cast.

Đây là một (rất đơn giản) ví dụ:

int Foo(std::string anInt) 
{ 
    return lexical_cast<int>(anInt); 
} 
-1
#include <string> 
#include <cmath> 
double _string_to_double(std::string s,unsigned short radix){ 
double n = 0; 
for (unsigned short x = s.size(), y = 0;x>0;) 
if(!(s[--x]^'.')) // if is equal 
n/=pow(10,s.size()-1-x), y+= s.size()-x; 
else 
    n+=((s[x]-48) * pow(10,s.size()-1-x - y)); 
return n; 
} 

hoặc

//In case you want to convert from different bases. 
#include <string> 
#include <iostream> 
#include <cmath> 
double _string_to_double(std::string s,unsigned short radix){ 
double n = 0; 
for (unsigned short x = s.size(), y = 0;x>0;) 
if(!(s[--x]^'.')) 
n/=pow(radix,s.size()-1-x), y+= s.size()-x; 
else 
    n+=((s[x]- (s[x]<='9' ? '0':'0'+7) ) * pow(radix,s.size()-1-x - y)); 
return n; 
} 
int main(){ 
std::cout<<_string_to_double("10.A",16)<<std::endl;//Prints 16.625 
std::cout<<_string_to_double("1001.1",2)<<std::endl;//Prints 9.5 
std::cout<<_string_to_double("123.4",10)<<std::endl;//Prints 123.4 
return 0; 
} 
+1

Điều này không biên dịch và rất khó đọc, không sử dụng các tính năng hiện có của thư viện chuẩn. Ngoài ra, câu hỏi là 2 tuổi và đã được trả lời rồi. – unkulunkulu

+1

Điều này sẽ biên dịch. Btw, tôi nghĩ rằng tôi sẽ cung cấp một thuật toán như trái ngược với các câu trả lời khác. – ausercomment

+1

Lý do bạn không thể biên dịch nó là arg1 trong _string_to_double, không được chỉ định là của không gian tên std. Nó được cố định ngay bây giờ. – ausercomment

0

coversion từ chuỗi tăng gấp đôi có thể đạt được bằng cách sử dụng 'strtod()' chức năng từ thư viện 'stdlib .h'

#include <iostream> 
#include <stdlib.h> 
int main() 
{ 
    std::string data="20.9"; 
    double value = strtod(data.c_str(), NULL); 
    std::cout<<value<<'\n'; 
    return 0; 
} 
11
#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    cout << stod(" 99.999 ") << endl; 
} 

Output: 99.999 (mà là gấp đôi, khoảng trắng được tự động tước)

Kể từ C++ 11 chuỗi chuyển đổi các giá trị dấu chấm động (như tăng gấp đôi) có sẵn với các chức năng:
stof - chuyển đổi str đến một phao
stod - chuyển đổi str cú đúp
stold - chuyển đổi str để một đôi dài

Như chuyển đổi chuỗi int cũng đã được đề cập trong câu hỏi, có các chức năng sau trong C++ 11:
stoi - chuyển đổi str đến một int
stol - chuyển đổi str để lâu
stoul - chuyển đổi str đến một unsigned dài
stoll - chuyển đổi str đến một lâu dài
stoull - chuyển đổi str đến một lâu

0

C++ chặng đường dài unsigned giải quyết chuyển đổi (không phải C cổ điển) là minh họa với chương trình bên dưới. Lưu ý rằng mục đích là để có thể sử dụng cùng một cơ sở định dạng được cung cấp bởi iostream như độ chính xác, ký tự điền, đệm, hex và các thao tác, v.v.

Biên dịch và chạy chương trình này, sau đó nghiên cứu. Nó là đơn giản

#include "iostream" 
#include "iomanip" 
#include "sstream" 
using namespace std; 

int main() 
{ 
    // Converting the content of a char array or a string to a double variable 
    double d; 
    string S; 
    S = "4.5"; 
    istringstream(S) >> d;  
    cout << "\nThe value of the double variable d is " << d << endl; 
    istringstream("9.87654") >> d; 
    cout << "\nNow the value of the double variable d is " << d << endl; 



    // Converting a double to string with formatting restrictions 
    double D=3.771234567; 

    ostringstream Q; 
    Q.fill('#'); 
    Q << "<<<" << setprecision(6) << setw(20) << D << ">>>"; 
    S = Q.str(); // formatted converted double is now in string 

    cout << "\nThe value of the string variable S is " << S << endl; 
    return 0; 
} 

GS Martinez

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