2

我遇到字符串连接问题。

std::deque<std::string> fileNamesVector;
double * res_array;
string *strarr;

size = fileNamesVector.size();
res_array = new double[size];
strarr = new string [size];

我需要在 res_array 后面加上 4 个空格,然后是文件名向量。我怎样才能做到这一点。

strarr[i] = res_array[i] + "     " + fileNamesVector[i];

但它给出了错误。说“exp 必须有算术或枚举类型”请帮忙。

4

3 回答 3

4

在 C++ 中,在 double、achar *​​ 或std::string.

res_array[i] + " "正在尝试将 double 添加到char *,因此编译器尝试进行隐式转换,但不存在,因此它会给您一个错误,说operator+需要数字类型。

相反,您需要显式转换res_array[i]为字符串。

// File: convert.h
#include <iostream>
#include <sstream>
#include <string>
#include <stdexcept>

class BadConversion : public std::runtime_error {
public:
  BadConversion(std::string const& s)
    : std::runtime_error(s)
    { }
};

inline std::string stringify(double x)
{
  std::ostringstream o;
  if (!(o << x))
    throw BadConversion("stringify(double)");
  return o.str();
}

上面的例子来自 The C++ FAQ,尽管有很多 stackoverflow 问题专门针对这个主题,但 TC++FAQ 值得真正为 OG 呐喊 :)

或者使用 C++11,使用std::to_string

strarr[i] = std::to_string(res_array[i]) + "     " + fileNamesVector[i];
于 2012-12-07T19:59:48.590 回答
0

如果您还没有使用 C++11,则应该将您的double转换为std::stringusing boost::lexical_cast

#include <boost/lexical_cast.hpp>
...
strarr[i] = boost::lexical_cast<std::string>(res_array[i]) + "     " + fileNamesVector[i];

http://www.boost.org/libs/conversion/lexical_cast.htm

附带说明一下,我强烈建议不要使用原始指针进行内存管理。如果你想要一个可变大小的数组std::vector应该是你的首选,而不是newand delete

于 2012-12-07T20:16:59.810 回答
0

不要使用原始数组和原始指针数组,例如std::vector

它存在于标准库中是有原因的。

也就是说,让你的生活更轻松。:-)

#include <assert.h>     // assert
#include <iostream>     // wcout, endl
#include <queue>        // std::dequeue
#include <stddef.h>     // ptrdiff_t
#include <string>       // std::string, std::to_string
#include <utility>      // std::begin, std::end
#include <vector>       // std::vector
using namespace std;

typedef ptrdiff_t       Size;
typedef Size            Index;

template< class Type >
Size size( Type const& c ) { return end( c ) - begin( c ); }

string spaces( Size const n ) { return string( n, ' ' ); }

wostream& operator<<( wostream& stream, string const& s )
{
    return (stream << s.c_str());
}

#ifdef __GNUC__
// Possibly add a workaround implementation of std::to_string
#endif

int main()
{
    deque<string>   file_names_vector;
    vector<double>  res_arr;

    file_names_vector.push_back( "blah.foo" );
    res_arr.push_back( 3.14 );

    assert( file_names_vector.size() == res_arr.size() );
    Size const size = file_names_vector.size();
    vector<string>  str_arr;

    for( Index i = 0; i < size; ++i )
    {
        str_arr.push_back( to_string( res_arr[i] ) + spaces( 5 ) + file_names_vector[i] );
    }

    for( auto const& s : str_arr )
    {
        wcout << s << endl;
    }
}
于 2012-12-07T20:35:16.243 回答