问题描述
- 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; }
解决方案
s.size()返回的是unsigned int,如果不强制转换成int类型的话,就会用一个-1的int和14的unsignedint比较,-1转换成unsigned int会是一个很大的数值
if((k*num+i*x) >= ((int)s.size()))
解决方案二:
这篇文章解释的很详细
http://blog.csdn.net/ljianhui/article/details/10367703
解决方案三:
不错的题,注意两数运算,当其中一个为unsigned 时,运算将隐式转换为无符号运算。
解决方案四:
补充一点,sizeof(a) a为类型或者变量 表达式的值 可作为数组下标。
时间: 2024-08-01 22:26:03