求教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;
//...
}
类似的例子还可以举很多。
#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;
}