討論區快速選單
知識庫快速選單
Excel也能做到大數據分析? 網路投保旅行平安險
[ 回上頁 ] [ 討論區發言規則 ]
字串格式化小工具
更改我的閱讀文章字型大小
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1003 | 人氣 3227 | 評價 1260 | 評價/貼文 1.26 | 送出評價 27 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2018/1/2 下午 07:34:08
這小程式能做到像 C# 的 WriteLine 能指定參數的插入位置
只是用了大量的複製、轉換和 regex_search 速度不太理
想,可能比 C# 還慢,不知還有沒有其他的方法
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1003 | 人氣 3227 | 評價 1260 | 評價/貼文 1.26 | 送出評價 27 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2018/1/2 下午 07:35:10
/*------------------------------------------------------------------------

用於處理字串格式化的小工具,可指定參數在字串中的插入位置。
範例:

stringstream ss;
Sprintf(ss, "我搭{1}去{0}。", "台北", "火車");

{0} = 第一個參數
{1} = 第二個參數
...

若有錯誤回傳 false,表示指定的參數超過提供的數量範圍

------------------------------------------------------------------------*/

#include <vector>
#include <ostream>
#include <string>
#include <regex>
#include <sstream>


template<typename... ARGS>
bool Sprintf(std::ostream &Receve, const char *format, ARGS&&... args);

class Sprint_t
{
 template<typename T>
 std::string ToString(T&& v)
 {
  std::stringstream ss;
  ss << v;
  return ss.str();
 };

 void SprintfArgs(std::vector<std::string> &str_args, size_t &N)
 {
 }

 template<typename ARG, typename... ARGS>
 void SprintfArgs(std::vector<std::string> &str_args, size_t &N, ARG&& arg, ARGS&&... args)
 {
  SprintfArgs(str_args, N, std::forward<ARGS>(args)...);
  str_args[--N] = ToString(std::forward<ARG>(arg));
 }

 template<typename... ARGS>
 bool Sprintf(std::ostream &Receve, const char *format, ARGS&&... args)
 {
  size_t N, NN;
  N = NN = sizeof...(args);
  std::vector<std::string> str_args(N);

  SprintfArgs(str_args, N, std::forward<ARGS>(args)...);

  std::regex rgx("\\{\\d+\\}");
  std::smatch sm;
  string f = format;
  while (std::regex_search(f, sm, rgx))
  {
   int Index = std::stoi(sm.str().c_str() + 1);
   if (Index < NN)
   {
    Receve << std::string(f, 0, sm.position());
    Receve << str_args[Index];
    f = sm.suffix().str();
   }
   else
    return false;
  }

  if (f.length() != 0)
   Receve << f;
 }

 // Constructor
 Sprint_t()
 {}
public:
 // Destructor
 ~Sprint_t()
 {}

 template<typename... ARGS>
 friend bool Sprintf(std::ostream &Receve, const char *format, ARGS&&... args);
};

// 若有錯誤回傳 false,表示指定的參數超過提供的數量範圍
template<typename... ARGS>
bool Sprintf(std::ostream &Receve, const char *format, ARGS&&... args)
{
 Sprint_t Sprint;

 return Sprint.Sprintf(Receve, format, std::forward<ARGS>(args)...);
}
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1003 | 人氣 3227 | 評價 1260 | 評價/貼文 1.26 | 送出評價 27 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2018/1/2 下午 07:36:19
#include <iostream>

using namespace std;

int main()
{
 const char *Dest = "台北";
 const char *Transport = "火車";

 {
  stringstream ss;
  if (!Sprintf(ss, "I go to {0} by {1}.", Dest, Transport))
   cout << "Err1" << endl;
  else
   cout << ss.str() << endl;
 }

 {
  stringstream ss;
  if (!Sprintf(ss, "我搭{1}去{0}。", Dest, Transport))
   cout << "Err2" << endl;
  else
   cout << ss.str() << endl;
 }

 return 0;
}

執行結果:
I go to 台北 by 火車.
我搭火車去台北。  
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1003 | 人氣 3227 | 評價 1260 | 評價/貼文 1.26 | 送出評價 27 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2018/1/4 上午 11:20:17
另外提供一個功能更多更好的連結

http://www.cnblogs.com/bodong/p/4799676.html
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2018/1/10 上午 12:46:29
有考慮用 boost::format 嗎?

作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1003 | 人氣 3227 | 評價 1260 | 評價/貼文 1.26 | 送出評價 27 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2018/1/10 上午 11:21:16

>有考慮用 boost::format 嗎?

可以考慮,只是要有 boost 的電腦才能編譯,我是盡量不用 boost
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 345 | 人氣 0 | 評價 1650 | 評價/貼文 4.78 | 送出評價 16 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2018/1/10 下午 12:04:27
>只是要有 boost 的電腦才能編譯,我是盡量不用 boost

Copy 過去不是就有了?而且這還不是執行環境的需求。

這原因有點說不過去。
若只是這個原因,那我們什麼程式庫都不要用不是最好?
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1003 | 人氣 3227 | 評價 1260 | 評價/貼文 1.26 | 送出評價 27 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2018/1/10 下午 02:32:28

>>只是要有 boost 的電腦才能編譯,我是盡量不用 boost
>
>Copy 過去不是就有了?而且這還不是執行環境的需求。
>
>這原因有點說不過去。
>若只是這個原因,那我們什麼程式庫都不要用不是最好?
>

我一直把 boost 視為 c++ 的試用版,比較希望等 c++ 納入後再使用,boost 玩玩可以,要放入專案中要考慮考慮

作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 345 | 人氣 0 | 評價 1650 | 評價/貼文 4.78 | 送出評價 16 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2018/1/10 下午 03:30:52
>我一直把 boost 視為 c++ 的試用版,比較希望等 c++ 納入後再使用,boost 玩玩可以,要放入專案中要考慮考慮

會問你這問題主要是想知道你的考量點為何?

我也不喜歡用 Boost,我的原因是:
1. 它太肥。
2. 他功能太多,不符合我的喜好。我比較喜歡需要什麼才包什麼進來,而不喜歡包天包地的程式庫。

但你的解釋並無法讓人明白實際的原因。
如果是不喜歡安裝其他程式庫的話,那不就是絕大部分的程式庫都不能用?就是什麼都要自己刻一個的意思?
比如說 libz, libpng, libjpeg, json, xml, ...

如果你能夠使用其他程式庫,卻不願意使用 Boost,這樣說不過來,至少從你的說明來看是解釋不通的!

另外,新版的 C++ 裡確實有很多功能是原來先在 Boost 做出來的,
但不代表 Boost 的所有東西(或至少大部份)都應該要被 C++ 納入標準。
期待某特性要被包在 C++ 裡才肯用,就好像在期待 PNG 讀寫要被納入 C++ 標準後我才要寫影像處理程式差不多!
作者 : cxxlman(CxxlMan) C++優秀好手貼文超過1000則
[ 貼文 1003 | 人氣 3227 | 評價 1260 | 評價/貼文 1.26 | 送出評價 27 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2018/1/10 下午 05:06:09
選用程式庫是一件重要的事,你的專案等於綁死在那了,明知 boost 只是過渡性的東西,怎能不慎重
 板主 : simula
 > C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++
1 Raymond 13050 
2 青衫 4760 
3 simula 4690 
4 coco 4030 
5 白老鼠(Gary) 3670 
6 ozzy 2540 
7 Ben 2250 
8 Anderson 1960 
9 windblown 1650 
10 Kenny 1560 
C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.15625