【问题标题】:Substring to position + exact char位置的子字符串 + 精确字符
【发布时间】:2015-07-18 16:01:48
【问题描述】:

我需要获取字符串的一部分,但将剪切“四舍五入”到下一个确切的字符“,”以避免错误剪切; 这个例子更清楚:

string hand =  "AA,KK,QQ,JJ,AKs,AKo,AQs,AQo,TT,AJs,ATs,AJo,KQs,KJs,KTs,QJs,ATo,QTs,JTs,A9s,A9o,KQo,A8s,A8o,A7s,A7o,A6s,A6o,A5s,A5o,A4s,99,A4o,A3s,A2s,KJo,J9s,T9s,Q9s,QJo,KTo,Q9o,88,77,66,QTo,A3o,A2o,JTo,K9s,K8s,K7s,K6s,K5s,K4s,K3s,K2s,Q8s,Q7s,Q6s,Q5s,K9o,J8s,T8s,98s,97s,87s,86s,76s,96s,75s,65s,64s,J9o,T9o,55,54s,53s,52s,K8o,43s,32s,42s,J7s,T7s,K7o,44,33,22,Q4s,Q3s,Q2s,J6s,J5s,T6s,T5s,J4s,K6o,Q8o,J8o,T8o,98o,97o,87o,85s,K5o,K4o,K3o,K2o,95s,74s,76o,65o,54o,84s,94s,Q7o,J7o,T7o,Q6o,J3s,T4s,J2s,Q5o,T3s,T2s,Q4o,J6o,86o,T6o,96o,93s,Q3o,74o,84o,75o,64o,T2o,94o,53o,93o,63o,43o,92o,73o,83o,52o,82o,42o,62o,72o,J5o,63s,92s,73s,Q2o,J4o,83s,85o,82s,T5o,95o,J3o,62s,T4o,J2o,72s,T3o,32o";

手长是 662。我想得到让我们说字符串手的前 7%:

  int startpos = 0;
  int stoppos= (662 * 7) / 100;
  string str2 = hand.substr(startpos, stoppos);
  cout <<  str2 << endl;

这将输出KTs,QJs,A

正如你看到的最后一手牌被砍掉了,所以我想为下一个昏迷添加子字符串以得到这个输出:KTs,QJs,ATo,

我是 C++ 初学者。

【问题讨论】:

标签: c++ string substring


【解决方案1】:

这是一个演示程序,展示了它是如何完成的。

#include <iostream>
#include <string>

struct classInstance {};

int main() 
{
    std::string hand = "KTs,QJs,ATo,QTs,JTs,A9s,A9o,KQo,A8s,A8o,A7s,A7o,A6s,A6o,A5s,A5o,A4s,"
                       "99,A4o,A3s,A2s,KJo,J9s,T9s,Q9s,QJo,KTo,Q9o,88,77,66,QTo,A3o,A2o,JTo";

    std::string::size_type start_pos;
    std::string::size_type char_num;

    start_pos = 0;
    char_num = 7 * hand.size() / 100;

    if ( start_pos + char_num < hand.size() )
    {        
        char_num = hand.find( ',', start_pos + char_num );
        if ( char_num != std::string::npos ) char_num -= start_pos - 1; 
    }

    std::string s = hand.substr( start_pos, char_num );

    std::cout << s << std::endl;
}

程序输出是

KTs,QJs,ATo,

考虑到成员函数substr的第二个参数指定要提取的字符数。

【讨论】:

    【解决方案2】:

    使用这个答案https://stackoverflow.com/a/3407254/2425366中的函数

    int roundUp(int numToRound, int multiple) { 
        if(multiple == 0) return numToRound;
        int remainder = numToRound % multiple;
        if (remainder == 0) return numToRound;
        return numToRound + multiple - remainder;
    }
    

    作为stoppos = roundUp(stoppos, 4);

    【讨论】:

    • thanks 效果很好,但是如果我尝试 startpos = 99 和 stopos=100 ,它不起作用,我应该在这种情况下需要一个 roundDown 函数吗?
    • @guillaumeimportexport 注释掉第三行。
    • 奇怪的是,当我的字符串长度为 662 时,这似乎不再起作用 .. 我用字符串 662 长度编辑了我的帖子,用 98% 对其进行测试以重现
    【解决方案3】:

    由于每只手占用 4 个字符(包括最后一个逗号),您可以将停止点四舍五入到最接近的 4 倍数:

    int stoppos = (169 * 7) / 100;
    stoppos = stoppos - stoppos % 4; // round down to nearest multiple of 4
    stoppos = (4 - stoppos % 4) + stoppos; // round up to nearest multiple of 4
    

    这将输出 KTs,QJs,KTs,QJs,ATo,,具体取决于您选择向上取整还是向下取整。如果你不想保留最后一个逗号,你可以多写一个- 1

    stoppos = stoppos - stoppos % 4 - 1;
    

    有关如何四舍五入到最接近的 4 倍数的更多想法,您可以查看this question

    【讨论】:

    • 你的例子输出KTs,QJ
    • 我的偏移量有误,我现在修好了。
    • 在这种情况下,我们应该向上取整而不是向下取整。我会把它添加到答案中。
    • 我差了一个。我调整了一下,测试了一下,现在应该可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 2012-05-21
    • 2015-03-30
    • 1970-01-01
    相关资源
    最近更新 更多