C ++用变量double替换部分字符串

时间:2015-04-04 19:10:59

标签: c++ string

我发现错误是:

_Mycont CXX0030:错误:表达式无法评估,_Mynextiter CXX0030:错误:表达式无法评估,但我仍然不知道如何修复

此程序使用字符串提示符并将“{0}”替换为5.651,将“{1}”替换为3.427,它可以正常工作。

但是,当我将字符串更改为“{0:c}”和“{1:c}”以替换子字符串并将其格式化为货币时,“{0:f}”和“{1:f}” “替换子字符串并将它们格式化为定点表示法,”{0:e}“和”{1:e}“替换子字符串并将其格式化为科学记数法,”{0:i}“和”{1 :i}“替换子字符串并舍入为整数,它们都可以独立工作。

但是当我尝试将它们放入像if(“{0}”)这样的情况时,如果(“{0:c}”)它只能在我寻找“{0}”的任何其他东西时才有效不行。我收到调试错误。我该如何解决这个问题,我做错了什么?提前致谢。

void main()
{
    write("The number {0} is greater than {1}.\n", 5.651, 3.427);
}

void write(string prompt, ...)
{
    double small, large, temp;

    va_list arguments;
    va_start(arguments, prompt);

    large = va_arg(arguments, double);
    small = va_arg(arguments, double);
    if(small > large)
    {
        temp = large;
        large = small;
        small = temp;
    }

    if(prompt.find("{0}"))
    {
        ostringstream a;
        a << large;
        string arg1 = a.str();
        ostringstream s;
        s << small;
        string arg2 = s.str();

        size_t pos = prompt.find("{0}");
        prompt = prompt.replace(pos, 3, arg1);
        size_t pos2 = prompt.find("{1}");
        prompt = prompt.replace(pos2, 3, arg2);
    }

    else if(prompt.find("{0:c}"))
    { 
        ostringstream a;
        a << large;
        string arg1 = "$" + a.str();
        ostringstream s;
        s << small;
        string arg2 = "$" + s.str();

        size_t pos = prompt.find("{0:c}");
        prompt = prompt.replace(pos, 5, arg1);
        size_t pos2 = prompt.find("{1:c}");
        prompt = prompt.replace(pos2, 5, arg2);
    }

    else if(prompt.find("{0:e}"))
    { 
        ostringstream a;
        a << scientific << large;
        string arg1 = a.str();
        ostringstream s;
        s << scientific << small;
        string arg2 = s.str();

        size_t pos = prompt.find("{0:e}");
        prompt = prompt.replace(pos, 5, arg1);
        size_t pos2 = prompt.find("{1:e}");
        prompt = prompt.replace(pos2, 5, arg2);
    }

    else if(prompt.find("{0:f}"))
    { 
        ostringstream a;
        a << fixed << setprecision(6) << large;
        string arg1 = a.str();
        ostringstream s;
        s << fixed << setprecision(6) << small;
        string arg2 = s.str();

       size_t pos = prompt.find("{0:f}");
       prompt = prompt.replace(pos, 5, arg1);
       size_t pos2 = prompt.find("{1:f}");
       prompt = prompt.replace(pos2, 5, arg2);
    }

    else if(prompt.find("{0:i}"))
    { 
        ostringstream a;
        a << (int)large;
        string arg1 = a.str();
        ostringstream s;
        s << (int)small;
        string arg2 = s.str();

        size_t pos = prompt.find("{0:i}");
        prompt = prompt.replace(pos, 5, arg1);
        size_t pos2 = prompt.find("{1:i}");
        prompt = prompt.replace(pos2, 5, arg2);
    }

    cout << prompt;
    cout << endl;

    va_end(arguments);
}

1 个答案:

答案 0 :(得分:1)

您的&#34; 中的表达式&#34;条件不是你认为它正在做的事情。见documentation for std::string find function

  

返回值

     

第一场比赛的第一个角色的位置。如果未找到匹配项,则函数返回string :: npos。

所以这个

if(prompt.find("{0}"))

应该是

if(prompt.find("{0}") != string::npos)

如果找不到您使用查找查找的字符串文字,查找会返回 string :: npos ,它不等于零,所以 if 评估为 true ,这不是你想要的。同样适用于所有其他 if 条件查找