读书人

求教c++ 关于默认参数的有关问题

发布时间: 2013-06-25 23:45:41 作者: rapoo

求教c++ 关于默认参数的问题。
小弟写了个程序,编译器是vc++6.0,但是运行时输入参数后按enter建后就没有反应了,因能力有限求教各位大神帮小弟检查出错误。拜谢。
程序如下:
#include<iostream>
const int arsize = 80;
char * left(const char * str, int n = 1);
int main()
{
using namespace std;
char sample[arsize];
cout << "enter a string:\n";
cin.get(sample,arsize);
char *ps = left(sample,4);
cout << "ps = " << ps << endl;
delete []ps;
ps = left(sample);
cout << ps << endl;
return 0;


}
char * left(const char * str, int n)
{
if (n < 0)
n = 0;
char * p = new char[n + 1];
int i;
for(i = 0; (i < n)&& (str[i] !='\0'); i++)
*(p + i) = str[i];
while (i <= n)
*(p + i +1) = '\0';
return p;
} C++ 默认参数
[解决办法]
while (i <= n)
*(p + i +1) = '\0';
return p;

死循环。改为*(p + i++) = '\0';
[解决办法]

不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) return;
//...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
a=fgetc(f);
//...
b=fgetc(f);//可能此时已经feof了!
//...
}
而这样写就没有问题:
whlie (1) {
a=fgetc(f);
if (feof(f)) break;
//...
b=fgetc(f);
if (feof(f)) break;
//...
}
类似的例子还可以举很多。

计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

[解决办法]

#include<iostream>
const int arsize = 80;
char * left(const char * str, int n = 1);
int main()
{
using namespace std;
char sample[arsize];
cout << "enter a string:\n";
cin.get(sample,arsize);
char *ps = left(sample,4);


cout << "ps = " << ps << endl;
delete []ps;
ps = left(sample);
cout << ps << endl;
delete [] ps;//这里应该delete。。
return 0;
}
char * left(const char * str, int n)
{
if (n < 0)
n = 0;
char * p = new char[n + 1];
int i;
for(i = 0; (i < n)&& (str[i] !='\0'); i++)
*(p + i) = str[i];
while (i <= n){
*(p + i) = '\0';//这里不用+1。。。
++i;//这里要++,否则会死循环。。
}
return p;
}


[解决办法]
while里面没有对i处理,所以字符串长度小于4,就死循环了

读书人网 >C++

热点推荐