为什么此代码会触发某个数字的断点?

时间:2019-06-09 21:09:13

标签: c++ string visual-studio runtime-error

我想用3乘3分隔给定数字的数字。

  

输入:1234567
  输出:1,234,567

并且我编写了以下代码:


override func viewDidLoad() {

    let tap = UITapGestureRecognizer(target: self, action: #selector(moreInfo))
    tap.numberOfTapsRequired = 2
    view.addGestureRecognizer(tap)
}

// the main switch case
switch choice {
case 1:
    print("1 is chosen")
    moreInfo(option:1)
case 2:
    print("2 is chosen")
    moreInfo(option:2)

}


//to be activated when double tap 
@objc func moreInfo(option: Int) {
    switch choice {
    case 1:
        print("more information for 1")

    case 2:
        print("more information for 2")
    }
}

如下面的照片所示,该代码对于带有...

1、2、3、4、5、6、7、8、9、10、11、12位数字
enter image description here

16、17、18、19、20、21、22、23、24位数字

enter image description here

32、33、34、35、36位数字

enter image description here

但是它会触发某个数字断点。这些特定数字是13、14、15、25、26、27、28、29、30、31

我在这里跟踪了13位数字的代码。
enter image description here
enter image description here
enter image description here
enter image description here
enter image description here
enter image description here

2 个答案:

答案 0 :(得分:2)

它对您不起作用的原因是您帖子的评论。对于答案,以下代码应为您完成工作:

string str;
string::iterator it;
cout << "Enter a number with any number of digits: ";
cin >> str;
if (str.size() > 3) {
    it = str.end() - 3; // Take the first place where there should be a comma
    while (it > StringIn.begin()) { // Make sure that you are still in a string's place
        if (it - str.begin() > 3)
            it = str.insert(it, ',') - 3; // Insert a comma in the right place, and move to the next comma place
        else it = str.begin();
    }
}
cout << str << endl;

答案 1 :(得分:1)

我这样解决了这个问题:

#include <iostream>
#include <string>

using namespace std;


int main()
{
    string StringIn;
    cout << "Enter a number with any number of digits: ";
    cin >> StringIn;
    unsigned int len = StringIn.length();
    if (len % 3 == 0)
        for (int i = 1; i < len / 3; i++)
            StringIn.insert(StringIn.end() - (4 * i - 1), ',');
    else
        for (int i = 1; i <= len / 3; i++)
            StringIn.insert(StringIn.end() - (4 * i - 1), ',');
    cout << StringIn << endl;
    system("pause");
    return 0;
}

previous version of the code中,指向it1StringIn的字符串指向末尾的it2未更新。所以我写了这行

it1 = StringIn.end();  

通过

StringIn.insert(StringIn.end() - (4 * i - 1), ',');  

但是由于修改了字符串,因此每次迭代的表达式都应该有微小的变化。
考虑:

1234567890123456789012  

i=1时,','字符应插入end-3

1234567890123456789,012  

i=2时,','字符应插入end-7中而不是end-6中,因为在先前的迭代中插入了','

1234567890123456,789,012  

i=3时,','字符应插入end-11中而不是end-9中,因为在先前的迭代中插入了两个','

因此,在第i次迭代中,从先前的迭代中插入了(i-1)个数字','。为了在正确的位置插入',',我们应该从末尾退后3 * i + (i - 1)步。

这就是为什么我将第19和22行写成这种形式

enter image description here