我是一个库的开发人员,我们的旧代码使用sscanf()和sprintf()从/到字符串读/写各种内部类型.我们遇到过使用我们库的用户的问题,并且其语言环境与我们基于XML文件的语言环境不同("C"语言环境).在我们的例子中,这导致从这些XML文件解析的值不正确,以及在运行时以字符串形式提交的值.区域设置可以由用户直接更改,但也可以在用户不知情的情况下进行更改.如果区域设置更改发生在另一个库中,例如GTK,这是一个错误报告中的"犯罪者",就会发生这种情况.因此,我们显然希望从语言环境中删除任何依赖关系,以永久地摆脱这些问题.
我已经在float/double/int /的上下文中阅读了其他问题和答案,特别是如果它们被一个字符分隔或位于括号内,但到目前为止,我发现的建议解决方案并不令我们满意.我们的要求是:
除了标准库之外,不依赖于库.因此,使用boost中的任何内容都不是一种选择.
必须是线程安全的.这具体涉及可以全局更改的区域设置.这对我们来说真的很糟糕,因为我们库的一个线程可能会受到用户程序中另一个线程的影响,该线程也可能正在运行一个完全不同的库的代码.setlocale()因此,任何直接受影响的东西都不是一种选择.此外,由于线程中的竞争条件,在开始读/写之前设置区域设置并将其设置回原始值不是解决方案.
虽然效率不是最重要的优先级(#1和#2),但它仍然是我们关注的问题,因为字符串可能会在运行时频繁地读取和写入,具体取决于用户的程序.越快越好.
编辑:作为补充说明:boost::lexical_cast不保证不受语言环境的影响(来源:boost :: lexical_cast <>的语言环境不变保证).即使没有要求#1,这也不是解决方案.
到目前为止,我收集了以下信息:
std::to_string,std::stod,std::stof,等取决于全球区域只是sscanf的方式和sprintf做的,这是非常不幸的,我不理解的,考虑到的std ::螺纹已被添加.std::stringstream似乎是一般的解决方案,因为它在语言环境的上下文中是线程安全的,但一般来说如果保护正确的话.但是,如果它每次都是新建的,那么它很慢(良好的比较:http://www.boost.org/doc/libs/1_55_0/doc/html/boost_lexical_cast/performance.html).我假设这可以通过配置和使用每个线程一个这样的流来解决,每次使用后清除它.但是,问题在于它不能像以下那样容易地解决格式sscanf(),例如:" { %g , %g } ".sscanf() 例如,我们需要能够阅读的模式是:
" { %g , %g }"" { { %g , %g } , { %g , %g } }"" { top: { %g , %g } …可能重复:
如何在C++中将数字转换为字符串,反之亦然
陶氏string在C++中将积分值转换为a ?
这就是我尝试过的:
for(size_t i = 0;vecServiceList.size()>i;i++)
{
if ( ! vecServiceList[i].empty() )
{
string sService = "\t" + i +". "+ vecServiceList[i] ;
}
}
Run Code Online (Sandbox Code Playgroud)
这是错误:
invalid operands of types 'const char*' and 'const char [3]' to binary 'operator+'
Run Code Online (Sandbox Code Playgroud) 我试图将一个整数连接到一个已知的字符串,我发现有几种方法可以做到这一点,其中两个是:
int num=13;
string str = "Text" + static_cast<ostringstream*>( &(ostringstream() << num) )->str();
Run Code Online (Sandbox Code Playgroud)
或者我也可以使用boost库' lexical_cast:
int num=13;
string str= "Text" + boost::lexical_cast<std::string>(num);
Run Code Online (Sandbox Code Playgroud)
是否boost::lexical_cast以任何方式使用更高效,因为我已经知道转换类型(intto string)?或者static_cast同样有效,而不必依赖外部库?
我知道这是非常基本的,但我对C++很新,似乎无法找到答案.我只是想将一些整数转换为字符串.此方法有效:
int a = 10;
stringstream ss;
ss << a;
string str = ss.str();
Run Code Online (Sandbox Code Playgroud)
但是当我需要像这样转换第二个和第三个时:
int b = 13;
stringstream ss;
ss << a;
string str2 = ss.str();
int c = 15;
stringstream ss;
ss << b;
string str3 = ss.str();
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
'std::stringstream ss' previously declared here
Run Code Online (Sandbox Code Playgroud)
我需要以某种方式关闭stringstream吗?我注意到如果我在代码中将它们彼此远离,编译器并不介意,但这似乎不是我应该做的事情.有没有人有建议?
所以基本上我正在尝试做一个分数类.它将从用户输入中获取分数并执行添加.例如,我输入1 5和1 7,添加它将打印出12/35.
这是我的.h课程:
#include <string>
#ifndef _FRACTION_H_
#define _FRACTION_H_
using namespace std;
class Fraction
{
public:
Fraction();
Fraction(int n, int d);
int getNumerator() const;
int getDenominator() const;
void display();
string to_string();
Fraction operator+(Fraction &second);
private:
int numerator;
int denominator;
};
Run Code Online (Sandbox Code Playgroud)
这是我的.cpp文件:
#include "Fraction.h"
#include <string>
include <iostream>
using namespace std;
Fraction::Fraction(){}
Fraction::Fraction(int n, int d)
{
this->numerator = n;
this->denominator = d;
}
int Fraction::getNumerator() const
{
return numerator;
}
int Fraction::getDenominator() const
{
return …Run Code Online (Sandbox Code Playgroud) 如何将字符串中的每个字符设置为整数?这是我编写哈希函数时必须做的第一件事.我必须将字符串中的每个字符设置为一个整数,以便我可以将它们的值相加.请帮忙!它是这样的吗?
int hashCode(string s)
{
int Sum = 0;
for(int i=0; i<strlen(s); i++)
{
Sum += (int)s[i];
}
return Sum;
}
Run Code Online (Sandbox Code Playgroud) 我想要一个int值在屏幕上显示为一个字符串.这是我在opengl做的游戏.我有这样的事情:
char *string = "0"; // to declare
sprintf (label,"%d" ,string); // This prints 0
Run Code Online (Sandbox Code Playgroud)
这非常适合在屏幕上打印0,但是您可能会理解我希望0更改.我尝试将int转换为字符串并尝试将其分配给char*字符串,但我认为这是不可能的.我是C++的新手,所以我不太了解我会非常感谢你的帮助.我想要实现的是:
char *string = "0"; // to declare
int number = 90; // declare int to be converted;
sprintf (label,"%d" ,string); // This prints 90
Run Code Online (Sandbox Code Playgroud)
我发现将int的方法转换为char方法,但是已经解决了我的问题.提前感谢您的帮助.
可能重复:
如何在C++中将数字转换为字符串,反之亦然
在csharp
string s1="12345"
string s2="54321"
public double (string s1,string s2)
{
convert.todouble(s1) +convert.to-double(s2)
}
Run Code Online (Sandbox Code Playgroud)
我是如何在c ++中做的,因为没有转换类
我想转换int为char *
char str[10]=;
int i=567;
str=itoa(i, str, 10)
Run Code Online (Sandbox Code Playgroud)
这给str第三行带来了错误
str must have a modifiable lvalue
我想创建一个程序,读取包含两个数字和一个运算符的字符串,并打印出结果.它不断显示算术运算符的错误.例如,我如何将两个字符串一起添加?
int main()
{
string number1;
string number2;
string operation;
string answer;
cout << "Enter numbers with respective operations";
cout << "number 1";
cin >> number1;
cout << "number2";
cin >> number2;
cout << "operation";
cin >> operation;
if (operation == "+")
{
answer = number1 + number2;
cout << "the sum is " << answer << endl;
}
else if (operation == "-")
{
answer = number1 - number2;
cout << "the difference is " << answer << endl; …Run Code Online (Sandbox Code Playgroud)