2009-07-14 30 views
27

Possible Duplicate:
How do I convert a double into a string in C++?Çifti C++ dizesine dönüştürme

Ben bir dize birleştirmek istiyorsanız ve bir çift ve g ++ bu hatayı atıyor:

main.cpp: fonksiyonda 'int main()':
main.cpp: 40: hata: tiplerin const char [2] 'geçersiz işlenen bu hatayı atma kod çizgisi ikili 'operatör +' Burada

ve 'ikili':

 
storedCorrect[count] = "("+c1+","+c2+")"; 

storedCorrect [] dize dizidir ve C1 ve C2 iki katına çıkar. Programımın doğru şekilde derlenmesine izin vermek için c1 ve c2 dizelerini dönüştürmenin bir yolu var mı?

+11

Aşağıdaki örneklerden bazıları hakkında: http://www.codeproject.com/KB/recipes/Tokenizer.aspx Bunlar çok verimli ve biraz zarif. –

+0

http://stackoverflow.com/q/29200635/395461 – Shannon

cevap

22

kullanın std::stringstream. Tüm dahili tipler için operator << aşırı yüklenmiştir. Beklediğiniz gibi

#include <sstream>  

std::stringstream s; 
s << "(" << c1 << "," << c2 << ")"; 
storedCorrect[count] = s.str(); 

Bu çalışır - std::cout ile ekrana yazdırmak aynı şekilde. Bunun yerine bir dizgeye "yazdırıyorsunuz". operator << internal'leri (örneğin doublestring kadar) yeterince yer olduğundan emin olmaya ve gerekli dönüşümleri yaparak ilgileneceğim. Eğer Boost kütüphane mevcuttur varsa

Ayrıca, sen lexical_cast içine bakarak düşünün olabilir. sözdizimi çok normal bir C++ gibi görünüyor - tarzı atmalarını: Kaputun altında

#include <string> 
#include <boost/lexical_cast.hpp> 
using namespace boost; 

storedCorrect[count] = "(" + lexical_cast<std::string>(c1) + 
         "," + lexical_cast<std::string>(c2) + ")"; 

, boost::lexical_cast temelde std::stringstream ile yaptığının aynısını yapıyor. Boost kütüphanesini kullanarak önemli bir avantajı, (ör stringdouble kadar) aynı kolaylıkla başka bir yol olabilir olduğunu. Artık atof() veya strtod() ve çiğ C tarzı dizeleri karıştırmasını.

+0

Aslında, 'lexical_cast' boost :: stringstream' başlık altında değil. "Stringstream" işlevinden çok daha hızlı olan ve çoğu durumda "scanf"/"printf" den daha hızlı olan kendi dönüştürme yordamlarını uygular. Bakınız: http://www.boost.org/doc/libs/1_48_0/doc/html/boost_lexical_cast/performance.html – Ferruccio

+0

'lexical_cast' kaynağının en son ne zaman göründüğünden çok farklı görünüyor. Geçtiğimiz birkaç Boost sürümünde performansı önemli ölçüde artırmış görünüyorlar. Yapabilmen için daha fazla sebep var. –

71

doğrudan bunu yapamaz.

std::ostringstream s; 
s << "(" << c1 << ", " << c2 << ")"; 
storedCorrect[count] = s.str() 
  • Kullanım boost::lexical_cast:

    storedCorrect[count] = "(" + boost::lexical_cast<std::string>(c1) + ", " + boost::lexical_cast<std::string>(c2) + ")"; 
    
  • kullanın std::snprintf:

    1. bir std::stringstream kullanın: bunu yapmak için birçok yolu vardır

      char buffer[256]; // make sure this is big enough!!! 
      snprintf(buffer, sizeof(buffer), "(%g, %g)", c1, c2); 
      storedCorrect[count] = buffer; 
      

    Çeşitli çift dizgeli dönüştürme işlevlerini kullanan başka birçok yöntem vardır, ancak bunları görmenin ana yolları vardır.

  • +4

    Bu cevabın eski olduğunu biliyorum, ancak ayrıca std :: string to_string (double); 'burada eklemek isteyebilirsiniz. – JohnJohn

    1

    Sprintf'in sizin için doğru işlev olduğuna inanıyorum. Printf gibi standart kütüphanede.Daha fazla bilgi için aşağıdaki bağlantıyı takip edin: C++ 11 use std::to_string yılında

    http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/

    +8

    'sprintf', sayı biçimlendirmesi için güvensizdir, çünkü çıktı arabelleği üzerinde herhangi bir sınırlama yapmaz ve herhangi bir 'çifte' değeri için güvenli olacak arabelleğin boyutunu belirlemek için iyi bir taşınabilir yol yoktur. –

    +0

    Bu durumda, 'snprintf' kullanın :) Ama aslında, gerekli tampon boyutunu tahmin etmek zor olabilir. – tomsmeding

    26

    varsayılan biçimi (%f) kabul eğer.

    storedCorrect[count]= "(" + std::to_string(c1) + ", " + std::to_string(c2) + ")"; 
    
    İlgili konular