相关疑难解决方法(0)

从字符串中有效地读取括号中两个以逗号分隔的浮点数,而不受全局语言环境的影响

我是一个库的开发人员,我们的旧代码使用sscanf()sprintf()从/到字符串读/写各种内部类型.我们遇到过使用我们库的用户的问题,并且其语言环境与我们基于XML文件的语言环境不同("C"语言环境).在我们的例子中,这导致从这些XML文件解析的值不正确,以及在运行时以字符串形式提交的值.区域设置可以由用户直接更改,但也可以在用户不知情的情况下进行更改.如果区域设置更改发生在另一个库中,例如GTK,这是​​一个错误报告中的"犯罪者",就会发生这种情况.因此,我们显然希望从语言环境中删除任何依赖关系,以永久地摆脱这些问题.

我已经在float/double/int /的上下文中阅读了其他问题和答案,特别是如果它们被一个字符分隔或位于括号内,但到目前为止,我发现的建议解决方案并不令我们满意.我们的要求是:

  1. 除了标准库之外,不依赖于库.因此,使用boost中的任何内容都不是一种选择.

  2. 必须是线程安全的.这具体涉及可以全局更改的区域设置.这对我们来说真的很糟糕,因为我们库的一个线程可能会受到用户程序中另一个线程的影响,该线程也可能正在运行一个完全不同的库的代码.setlocale()因此,任何直接受影响的东西都不是一种选择.此外,由于线程中的竞争条件,在开始读/写之前设置区域设置并将其设置回原始值不是解决方案.

  3. 虽然效率不是最重要的优先级(#1和#2),但它仍然是我们关注的问题,因为字符串可能会在运行时频繁地读取和写入,具体取决于用户的程序.越快越好.

编辑:作为补充说明:boost::lexical_cast不保证不受语言环境的影响(来源:boost :: lexical_cast <>的语言环境不变保证).即使没有要求#1,这也不是解决方案.

到目前为止,我收集了以下信息:

  • 首先,我看到的建议很多是使用boost的lexical_cast,但不幸的是,这对我们来说根本不是一个选项,因为我们不能要求所有用户也链接到boost(并且由于缺乏locale-safety) , 往上看).我查看了代码,看看我们是否可以从中提取任何内容,但我发现它很难理解,而且篇幅太长,而且很可能是性能提升者仍在使用依赖于语言环境的函数.
  • 在C++ 11引入了许多功能,如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++ parsing std

9
推荐指数
1
解决办法
329
查看次数

size_t在C++中转换/强制转换为字符串

可能重复:
如何在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)

c++ string

8
推荐指数
1
解决办法
3万
查看次数

static_cast vs boost :: lexical_cast

我试图将一个整数连接到一个已知的字符串,我发现有几种方法可以做到这一点,其中两个是:

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++ string boost casting

4
推荐指数
1
解决办法
1803
查看次数

C++将int转换为字符串

我知道这是非常基本的,但我对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吗?我注意到如果我在代码中将它们彼此远离,编译器并不介意,但这似乎不是我应该做的事情.有没有人有建议?

string int

3
推荐指数
1
解决办法
6万
查看次数

C++中的分数添加

所以基本上我正在尝试做一个分数类.它将从用户输入中获取分数并执行添加.例如,我输入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)

c++

3
推荐指数
1
解决办法
6494
查看次数

在C++中将字符转换为整数

如何将字符串中的每个字符设置为整数?这是我编写哈希函数时必须做的第一件事.我必须将字符串中的每个字符设置为一个整数,以便我可以将它们的值相加.请帮忙!它是这样的吗?

    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)

c++ string char

2
推荐指数
2
解决办法
2万
查看次数

将int转换为char*进行打印

我想要一个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++ int char typeconverter

2
推荐指数
1
解决办法
1万
查看次数

在c ++中添加两个字符串

可能重复:
如何在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 ++中做的,因为没有转换类

c++ visual-c++

1
推荐指数
1
解决办法
440
查看次数

在C++中将int转换为char*

我想转换intchar *

char str[10]=;
int i=567;

str=itoa(i, str, 10)
Run Code Online (Sandbox Code Playgroud)

这给str第三行带来了错误

str must have a modifiable lvalue

c++ int char

0
推荐指数
1
解决办法
2万
查看次数

如何在C++中对字符串应用算术运算?

我想创建一个程序,读取包含两个数字和一个运算符的字符串,并打印出结果.它不断显示算术运算符的错误.例如,我如何将两个字符串一起添加?

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)

c++

0
推荐指数
1
解决办法
277
查看次数

标签 统计

c++ ×9

string ×4

char ×3

int ×3

boost ×1

casting ×1

parsing ×1

std ×1

typeconverter ×1

visual-c++ ×1