2 catcheryp Catcheryp 于 2016.03.07 23:57 提问

C++程序里面一个很奇怪的bug!跪求解释!!!

这是我试图求解leetcode 第六题,这不重要,主要看一下程序里面那个if语句的执行
问题,不用看我针对这道题的逻辑对不对,这不是重点,重点是那个if语句!!!
在代码那个(***)的地方我给了注释!!!

 #include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main()
{
    string s;
    int numRows;
    cin >> s >> numRows;
    char *ss = new char[s.size()];
    int k = 2 * numRows - 2;//每个单元元素的个数
    int m = s.size() / k;//一共有多少个单元
    int flag = s.size()  % k;
    if(flag != 0)
        m++;
    int n = 2 * m;
    //先对第一行单独处理
    for(int i = 0, j = 0; j < m; ++j, i = i + k)
    {
        ss[j] = s[i];
    }
    //对第二行至倒数第二行的处理
    //i =(所在行 - 1)
    //j =(所在列 - 1)
    int count = 0;
    int i = 1, j = 0;
    int x;
    cout << endl;
    while(i < numRows - 1)
    {
        while(count < n)
        {
            //偶数列时要加上行数,奇数列时要减去行数
            if(j % 2 == 1)
                x = 1;
            else
                x = -1;
            int num = (j / 2 + j % 2);//0 1 2 3 4 5 6 -> 0 1 1 2 2 3 3 

            cout << "k:" << k << '\n' << "num:" << num << '\n';
            cout << "i:" << i << '\n' << "x:" << x << '\n';
            cout << "s.size():" << s.size() << endl;

            //这里输入PAYPALISHIRING 3 之后 k=4,num=0,i=1,x=-1,s.size()=14明显if语句执行不了,
            //但是居然执行了,我好郁闷啊!!!求解!!! 

         (***)   if((k*num+i*x) >= s.size())
            {
                cout << "DDDDDDDDD"  << endl;
                break;
            }
            //m代表第一行元素的个数
            cout << "CCCCCCCCCC" << endl;
            ss[m+n*(i-1)+j] = s[k*num+i*x];
            cout << s[k*num+i*x];
            j++;
            count++;
        }
        i++;
    }
    //对最后一行进行处理
    i--;
    j--;
    for(int jj = m+n*(i-1)+j, ii = numRows-1; ii < s.size() && jj < s.size(); ++jj, ii = ii + k)
    {
        ss[jj] = s[ii];
    }

    cout << ss << endl;
    return 0;
}

4个回答

u013596119
u013596119   Rxr 2016.03.08 00:34
已采纳

s.size()返回的是unsigned int,如果不强制转换成int类型的话,就会用一个-1的int和14的unsignedint比较,-1转换成unsigned int会是一个很大的数值

 if((k*num+i*x) >= ((int)s.size())) 
u013596119
u013596119   Rxr 2016.03.08 00:35

这篇文章解释的很详细

 http://blog.csdn.net/ljianhui/article/details/10367703
WinsenJiansbomber
WinsenJiansbomber   2016.03.08 04:10

不错的题,注意两数运算,当其中一个为unsigned 时,运算将隐式转换为无符号运算。

Catcheryp
Catcheryp 谢谢你的回答,明白了!
接近 2 年之前 回复
John_ToStr
John_ToStr   Rxr 2016.03.08 15:41

补充一点,sizeof(a) a为类型或者变量 表达式的值 可作为数组下标。

John_ToStr
John_ToStr 回复Jimbo: char s[sizeof(int)]
接近 2 年之前 回复
WinsenJiansbomber
WinsenJiansbomber 没明白什么用
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!