c语言iostreamm 是 C++ 的缺陷吗,为什么

&&/&&&&/&&&&/&&
在调试过程中,运行时错误是最麻烦的问题。因为编译错误可以由编译器检查出来,而大多数编译器对运行时错误却无能为力。查错和纠错的工作完全由用户自己来完成。
运行时错误还分为两种:
一种是由于考虑不周或输入错误导致程序异常(Exception),比如数组越界访问,除数为零,堆栈溢出等等。
另一种是由于程序设计思路的错误导致程序异常或难以得到预期的效果。
对于第一类运行时错误,我们不需要重新设计解决问题的思路,认为当前算法是可行的、有效的。我们只需要找出输入的错误或考虑临界情况的处理方法即可。对于第二类运行时错误,不得不遗憾地说,一切都要从头再来。
见识运行时错误
由于编译器无法发现运行时错误,这些错误往往是在程序运行时以五花八门的形式表现出来。下面就是典型的几种因运行时错误引起的问题:
(1)WindowsXP错误报告
(2)内存不能为Read/Written
(3)非法操作
(4)Debug错误
查找错误点
语法错误的位置能很快地被编译器找到,而运行时错误的位置却很难被我们发现。即使我们一条条地检查语句,也未必能检查出什么。所以,在这里要介绍一种查找导致运行时错误的语句的方法。
我们知道,带有运行时错误的程序是可以运行的。当它运行到一个产生错误的语句时,就提示出错了。根据这个特点,我们可以用输出语句来判断程序的运行流程。下面就让我们来看一段有运行时错误的程序:(程序11.4)
#include &iostream&
int main()
& &char a[5],b[5];
& &int alen=0,blen=0;//记录字符串a和b的长度
& &cin &&a &&b;
& &for (int i=0;a[i]!='\0' && b[i]!='\0';i++)//计算字符串的长度
& & & if (a[i]!='\0')
& & & & &alen++;
& & & if (b[i]!='\0')
& & & & &blen++;
& &char *c=new char[alen+blen];//申请堆内存,存放连接后的字符串
& &for (i=0;i&=alen+i++)//把字符串a和b连接复制到字符串c
& & & if (i&alen)
& & & & &c[i]=a[i];
& & & else
& & & & &c[i]=b[i-alen];
& &cout &&c &&
& &delete []//释放堆内存
& &return 0;
运行结果:
TomatoStudio
udioTomat  葺葺葺葺癅
在程序运行结束之前,提示Debug Error,它属于一种运行时错误。而且根据输出的一些内容,发现程序也没有达到连接字符串的目的。所以我们让程序输出更多信息,查找错误原因。首先在计算字符串a和b的长度后,输出他们的长度,即在第一个for语句后添加一句cout &&&alen=& &&alen &&&blen=& &&blen &&。
运行结果:
TomatoStudio
alen=4blen=4
udioTomat  葺葺葺葺癅
OOTTMA字符串长为6,TomatoStudio字符串长为12。根据程序运行结果,我们发现计算出的字符串长度有问题。所以我们必须检查实现该功能的语句。另外,由字符串长度我们可以想到申请空间是否足够的问题。发现数组的空间只能存放5个字符,而现在两个字符串都已经超过这个限制。于是把数组空间扩大,该作char a[20],b[20];。
运行结果:
TomatoStudio
alen=6blen=6
OOTTMATomatoS  葺葺癅
发现字符串a的长度已经正确,可是字符串b的长度为什么不对呢?经过多次尝试,我们发现,正确的字符串长度总是较短的字符串。所以我们想到检查循环继续的条件是否正确,如果过早地终止循环,就会导致这种情况。果然,a[i]!='\0' && b[i]!='\0'意味着只要有一个字符串结束,那么长度计算就结束了,故把&&改成||。
运行结果:
TomatoStudio
alen=35blen=41
这么一改,居然两个长度全都错了。我们不禁要思考为什么会这样了:用一个for语句来计算两个字符串的长度,当循环变量越过任一个字符串的结尾符以后又误认为它没有结束,所以输出的长度远远长于字符串的实际长度。我们把计算字符串长度用两个for语句来实现。即程序被改写成这样:
#include &iostream&
int main()
& &char a[20],b[20];
& &cin &&a &&b;
& &for (int alen=0;a[alen]!='\0';alen++);//计算字符串a的长度
& & & for (int blen=0;b[blen]!='\0';blen++);//计算字符串b的长度
& & & & &cout &&&alen=& &&alen &&&blen=& &&blen &&
& &char *c=new char[alen+blen];
& &for (int i=0;i&=alen+i++)
& & &if (i&alen)
& & & & c[i]=a[i];
& & & else
& & & & c[i]=b[i-alen];
& &cout &&c &&
& &delete []
& &return 0;
运行结果:
TomatoStudio
alen=6blen=12
OOTTMATomatoStudio
现在两个字符串的长度都正确了,输出的内容也实现了字符串的连接,但是Debug Error仍然存在。继续检查,发现剩下的语句和申请的堆内存空间字符串c有关了。于是先检查c是否有越界访问。根据c申请的空间大小,发现for语句中循环继续的条件有错误,导致越界访问,把它改成i&alen+。
运行结果:
TomatoStudio
alen=6blen=12
OOTTMATomatoStudio  @
Debug Error已经没有了,看来造成这个错误的原因就是越界了。但是现在输出的字符串后面有乱码,可能是结尾符被忽略了。检查程序,发现alen+blen是两字符串长度,但是没有考虑结尾符,所以要给字符串c增加一个字符的空间。程序改写成如下:
#include &iostream&
int main()
& &char a[20],b[20];
& &cin &&a &&b;
& &for (int alen=0;a[alen]!='\0';alen++);
& & & for (int blen=0;b[blen]!='\0';blen++);
& & & & &//cout &&&alen=& &&alen &&&blen=& &&blen &&
& & & & &char *c=new char[alen+blen+1];
& &for (int i=0;i&alen+blen+1;i++)
& & & if (i&alen)
& & & & &c[i]=a[i];
& & & else
& & & & &c[i]=b[i-alen];
& &cout &&c &&
& &delete []
& &return 0;
运行结果:
TomatoStudio
OOTTMATomatoStudio
至此,程序修改完成。在目前的测试数据下,不再出现运行时错误,并且也能实现字符串连接的功能。
微信公众号:
各位粉丝,大家好,我是C语言中文网的站长(可以了解我),C语言中文网已经开通了微信公众号,名字是「码农宿舍」(不是C语言中文网哦),我将在这里和大家交流编程知识以及工作经验。大家可以搜索名字「码农宿舍」关注,也可以用微信扫描右边的二维码关注。
当你决定关注「码农宿舍」,你已然超越了99%的程序员!
推荐文章 TOP1016:13 提问
c++文件流相关问题,编译通过,但是结果为什么却报错?
源码如下,这是书上的一个习题:
#pragma warning(disable: 4786)
#include&map&
#include&set&
#include&iostream&
#include&fstream&
#include&string&
void initialize_exclusion_set(set&string&&);
void process_file(map&string,int&&,const set&string&&,ifstream&);
void user_query(const map&string,int&&);
void display_word_count(const map&string,int&&,ofstream&);
int main()
ifstream ifile("E:\\vc\\column.txt");//这里哪出错了啊??
ofstream ofile("E:\\vc\\column.map");//折腾了一下午,快疯了啊!
if(! ifile||!ofile)
cerr&&"Unable to open file --bailing out!\n";
return -1;
set&string&exclude_
initialize_exclusion_set(exclude_set);
map&string,int&word_
process_file(word_count,exclude_set,ifile);
user_query(word_count);
display_word_count(word_count,ofile);
void initialize_exclusion_set(set&string&&exs)
static string _exclude_words[25]={
"the","and","but","that","then","are","been","can","a","could","did","for","of","had","have","him","his","her","its","is","were","which","when","with","would"
exs.insert(_exclude_words,_exclude_words+25);
void process_file(map&string,int&&word_count,const set&string&&exclude_set,ifstream &ifile)
while(ifile&&word)
if(exclude_set.count(word))
word_count[word]++;
void user_query(const map&string,int&&word_map)
string search_
cout&&"Please enter a word to search:q to quit";
cin&&search_
while(search_word.size()&&search_word!="q")
map&string,int&::const_
if((it=word_map.find(search_word))!=word_map.end())
cout&&"Found!"&&it-&first&&"occurs"&&it-&second&&"times."&&
else cout&&search_word&&"was not found in text."&&
cout&&"\nAnother search?(q to quit)";
cin&&search_
void display_word_count(const map&string,int&&word_map,ofstream &os)
map&string,int&::const_iterator iter=word_map.begin(),end_it=word_map.end();
while(iter!=end_it)
os&&iter-&first&&"("&&iter-&second&&")"&&
小弟新手,第一次发帖,不知道问题出在哪里。所以发帖,希望能够得到你的帮助,先谢谢
问题描述:
1:代码可以正常编译通过,但是那个黑框框(是叫控制台吗?)却报错输出:Unable to open file --bailing out!(可是我已经在目录下创建了column.txt文件了啊,文件里面也有内容的)
2:我确定已经在E:\vc文件下面创建了column.txt文件。
3:还有一个信息不知道有没有用:奇怪的是,我把代码"E:\vc\column.txt")中的column改成text,却成功通过编译 运行结果也正常(之前学习输入输出流这一章节的时候,做过一个例题,是以text.txt命名的)
4:求助。。。
按赞数排序
你忘了字符转义了。路径分隔符 \\ 要用 \\\\。
不知道源码复制粘贴上去怎么变形了
我转义了,用的两个斜杠,但是粘贴上去不知道为什么整个代码都变形了,
仔细检查文件路径,文件名等是否完全一致。
编译通过说明你没有语法问题
没有出结果说明不是逻辑错误
那只能是运行时错误
看看是不是文件的读写属性的问题
不要沉啊啊啊啊啊。。。。。。
你是不是创建 column.txt 的这个文本编辑器还开着?文件处于锁定状态。
用 unlocker 工具检查一下。
相关参考资料09-1609-1309-1209-09
08-2008-2008-2009-14
也许你感兴趣
1. 2. 3. 4. 5. 6. 7. 8. 9. 10.

我要回帖

更多关于 c语言iostream 的文章

 

随机推荐