界忆 2024-03-17 07:15 采纳率: 100%
浏览 13
已结题

简单的C++字符串问题:编写如下面要求一个函数,那个最好呢?求各位出出点子看看如何优化。

简单的C++字符串问题:编写如下面要求一个函数,那个最好呢?求各位出出点子如何优化。
bool format_float(double innum, int precision,char *buff)
{//函数实现
}
要求:假设您要编写一个函数,可以将传入的 innum 浮点数格式化为一个字符串,并通过精度参数 precision 控制输出的小数位数,并将格式化后的结果存储在一个长度为 128 的缓冲区中。
下面代码可以做到但是感觉不是那么完美,你会如何用认为最好的方式写这段代码呢?:
以下是 C++ 版本的代码:

#include <iostream>
using namespace std;
void format_number(double innum, int precision, string& buff) {
    // 将输入的数字转为字符串
    string innum_str = to_string(innum);
    // 如果输入的数字没有小数部分,直接返回字符串
    if (innum_str.find('.') == string::npos) {
        buff += innum_str;
        return;
    }
    // 拆分整数和小数部分
    string int_part = innum_str.substr(0, innum_str.find('.'));
    string dec_part = innum_str.substr(innum_str.find('.') + 1);
    // 在小数部分末尾补0,直到达到指定精度
    dec_part.append(precision - dec_part.length(), '0');
    // 把整数部分和精度处理后的小数部分组合成新的字符串,并写入缓冲区
    buff += int_part + "." + dec_part;
}
int main() {
    // 定义字符串缓冲区
    string result_buffer;
    // 调用函数,并将结果写入缓冲区
    format_number(3.14159, 2, result_buffer);
    cout << result_buffer << endl;    // 应输出"3.14"
    // 清空缓冲区
    result_buffer.clear();
    // 调用函数,并将结果写入缓冲区
    format_number(3.14, 4, result_buffer);
    cout << result_buffer << endl;    // 应输出"3.1400"
    // 清空缓冲区
    result_buffer.clear();
    // 调用函数,并将结果写入缓冲区
    format_number(42, 3, result_buffer);
    cout << result_buffer << endl;    // 应输出"42"
    return 0;
}

输出结果:
3.14
3.1400
42

  • 写回答

6条回答 默认 最新

  • 愚梦者 2024-03-17 11:43
    关注

    如下例子您是认为可行否?

    #include <iostream>
    #include <cstdio> 
    #include "windows.h"
    void format_float(double innum, int precision, char *buff) {
        try
        {
            sprintf_s(buff,128, "%.*f", precision, innum < 128 ? innum : 127);
        }
        catch (const std::exception&)
        {
            ::MessageBoxA(NULL,"出现异常!请检查参数","错误",0);
        }    
    }
    int main()
    {
        // 定义一个长度为128的字符数组作为缓冲区
        char result_buffer[129] = { 0 }; // 额外一位用于存储终止符'\0'
        // 调用函数,并将结果写入缓冲区
        format_float(3.14159, 2, result_buffer);
        std::cout << result_buffer << std::endl; // 应输出"3.14"
        // 再次调用函数,并将结果写入缓冲区
        format_float(3.14, 4, result_buffer);
        std::cout << result_buffer << std::endl; // 应输出"3.1400"
        // 调用函数,并将结果写入缓冲区
        format_float(42, 3, result_buffer);
        std::cout << result_buffer << std::endl; // 应输出"42.000"
        getchar();//停留一下查看输出结果
        return 0;
    }
    
    输出结果:
    ![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/4449b2f5bd304fe19ca03c31478eb040.jpeg "#left")
    有同意的朋友欢迎到我博客指导一下
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 3月28日
  • 已采纳回答 3月20日
  • 创建了问题 3月17日

悬赏问题

  • ¥15 rt-thread线程切换的问题
  • ¥20 python忆阻器数字识别
  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊