C++基础:测试
每段代码中有0个或者多个错误。你的任务是找出并排除每个程序中的错误,当你排除了所有的错误之后,得到的程序编译,运行后就会输出“Success!” 即使你认为已经找到了一个错误,你仍然需要输入(原始、未修改的)程序并测试它;因为你可能猜错了,或者程序中还有其他错误。这个练习的另一个目的是让你感受一下编译器对不同错误的反应是怎么样子的。你不需要上面的程序框架25次,用剪贴,粘贴或者类似的技术就可以了。不要通过删除一条语句来逃避问题,你应该试着用修改、增加或删除一些字符来排除问题。
原始框架代码:
#include "std_lib_facilities.h"int main()
try{<<your code here>>keep_window_open();return 0;
}
catch (exception& e){cerr << "error: " << e.what() << '\n';keep_window_open();return 1;
}
catch(...){cerr << "Oops: unknown exception\n";keep_window_open();return 2;
}
注意:keep_window_open();这个语句的作用是使得Windows上的黑框停留一段时间,方便我们阅读窗口信息,我这里使用的是ubuntu24.4
其源码文件如下,我们使用的不带参数的第一个。
inline void keep_window_open()
{cin.clear();cout << "Please enter a character to exit\n";char ch;cin >> ch;return;
}inline void keep_window_open(string s)
{if (s == "") return;cin.clear();cin.ignore(120, '\n');for (;;) {cout << "Please enter " << s << " to exit\n";string ss;while (cin >> ss && ss != s)cout << "Please enter " << s << " to exit\n";return;}
}
1 Cout << “Success!\n”;
cout << "Success!\n"
2 cout << "Success!\n;
其实就差一后半个双引号,但会报<<(输出流符号)不匹配的问题,所以编译器报错了看看代码前后几行有时候更容易知道问题所在。
3 cout << “Success!” <<!\n";
4 cout << success << ‘\n’;
5 string res = 7; vector v(10); v[5] = res; cout <<“Success!\n”;
6 vector v(10); v(5) = 7; if (v(5)!= 7) cout <<''Success!\n";
vector<int> v(10);v[5] = 7; if (v[5]== 7)cout <<"Success!\n";
7 if (cond ) cout << “Success!”; else cout <<“Fail!\n”;
int cond = 1;
8 bool c = false; if (c ) cout << “Success!\n”; else cout <<“Fail!\n”;
if (!c) cout << "Success!\n";
9 string s = “ape”;bool c = “fool” < s;;if( c) cout << “Success!\n”;
其实就是两个单词首字母的比较,f<a明显是假的,所以为0,要想成功输出,要么改成大于符号,要么!c。
if(!c) cout << "Success!\n";
10 string s = “ape”;if ( s == “fool”) cout << “Success!\n”;
没有报错,只需要将if条件改成小于(<)或者不等于(!=)就能成功输出。
11 string s = “ape”;if ( s == “fool”) cout < “Success!\n”;
if ( s != "fool") cout << "Success!\n";
12 string s = “ape”;if ( s +“fool”) cout < “Success!\n”;
修改后一个错误,更为详细的+不能转换成bool类型。
if ( s < "fool") cout << "Success!\n";
13 vector< char> v(5) ;for(int i= 0;i<v.size();++i) ;cout<< “Success!\n”;
注意:for循环体为空语句,所以执行完,然后确认后输出Success。
14 vector< char> v(5) ;for(int i= 0;i<=v.size();++i) ;cout<< “Success!\n”;
这里有个很隐蔽的范围错误,就是i<= v.size(),幸好它的循环体不是遍历V,否则会访问v[5]的地址,造成越界。
15 string s = “Success!\n”;for(int i = 0; i < 6;++i) cout << s[i];
只输出了“Success!"的前5个字符。
for(int i = 0; i < 8;++i) cout << s[i];
16 if (true) then cout <<“Success!\n”;else cout << “Fail!\n”;
17int x = 2000; char c = x; if(c==2000) cout <<“Success!\n”;
我们char的大小范围是128~127,所以这里char c = x ,发生了窄化错误,char实际存储不了2000那么大的数字,所以必然不等于2000.
if(c < 2000) cout <<"Success!\n";
18 string s = “Success!\n”;for(int i = 0; i<10; ++i) cout <<s[i];
这里不记得C++关键字是大写,还是小写,所幸试了一把,结果为错,应为所有字母都小写。
19vector v(5);for(int i =0; i <= v.size();++i); cout <<“Success!\n”;
缺乏模板参数,所以导致的模板参数推导/替换失败
vector<int> v(5);
for(int i =0; i < v.size();++i);
20 int i = 0; int j = 9; while(i < 10) ++j;if(j<i)cout <<“Success!\n”;
while语句终结条件为i < 10,但是其循环体中没有对增量i的任何使用,所以会一直循环下去。
21 int x = 2; double d = 5/(x-2); if (d == 2*x +0.5)cout <<“Success!\n”;
我们知道分母不能为0,这里直接算术异常。
22 string s = “Success!\n”;for(int i = 0; i < 10; ++i) cout << s[i];
#include "std_lib_facilities.h"int main()
try{string s = "Success!\n";for(int i = 0; i < 9; ++i) cout << s[i];keep_window_open();return 0;
}
catch (exception& e){cerr << "error: " << e.what() << '\n';keep_window_open();return 1;
}
catch(...){cerr << "Oops: unknown exception\n";keep_window_open();return 2;
}
这里索引越界,"Success!\n"有9个字符,是个范围错误。可以用以下代码测试一下:
std::string s = "Success!\n";
if (9 < s.size()) {// This line will not execute because 9 is not less than s.size()char c = s[9]; } else {std::cout << "Index out of bounds!" << std::endl;
}
23 int i = 0;while(i <10) ++j;if(j<i) cout <<“Success!\n”;
将j定义好之后,将会进入死循环。
int i = 0;int j = 0;while(i < 10) cout << ++j;
24 int x = 4; double d = 5/(x-2); if (d = 2*x+0.5) cout <<“Success!\n”;
因为这个是整型除法,所得到的结果也是整型2,然后被转换成double。由于if条件是d = 2*x+0.5,的赋值语句,所得结果大于0,所以是bool类型为真(或者是1)。
25 cin << “Success!\n”;
改正错误并不难,但记住这个输入符号的方向挺难记的,输入符号是>>,比如cin >> s;就是把你输入到电脑上的东西,通过cin读入存储到变量s中。输出符号,我把cout想象成电脑屏幕,然后方向指向它,这样就不容易记错了。
所有的错误类型基本上都调试完毕了。