`
hoary20
  • 浏览: 138174 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

<<21天学通C++>>例子代码错误

阅读更多
由美国Jesse Liberty编著,康博创作室翻译,人民邮电出版社出版的第三版的<<21天学通C++>>中有个程序例子有Bug。该例子为第八章 指针 8.12 指针算法 例子8.11 如何根据字符串分析出单词。 第204页
源码是
#include <iostream>
using namespace std;

bool getWords(char * string,char * word,int & wordOffset);
int main(){
	const int bufferSize = 255;//the max length of input string
	char buffer[bufferSize+1];
	char word[bufferSize+1];
	int wordOffset = 0;

	cout<<"enter a string: ";
	cin.getline(buffer,bufferSize);
	while(getWords(buffer,word,wordOffset)){
		cout<<"got this word: "<< word <<endl;
	}

	return 0;
}
bool getWords(char * string,char * word,int & wordOffset){
	if(!string[wordOffset]){
		return false;
	}
	char *p1, *p2;
	p1=p2=string+wordOffset;
	for(int i=0;i<(int)strlen(p1)&&!isalnum(p1[0]);i++){
		p1++;
	}
	if(!isalnum(p1[0])){
		return false;
	}
	p2=p1;
	while(isalnum(p2[0])){
		p2++;
	}
	int len=int(p2-p1);
	strncpy(word,p1,len);
	word[len]='\0';
	for(int j=int(p2-string);j<(int)strlen(string)&&!isalnum(p2[0]);j++){
		p2++;
	}
	wordOffset=int(p2-string);
	return true;
}



正确的程序代码应该为:
#include <iostream>
using namespace std;

bool getWords(char * string,char * word,int & wordOffset);
int main(){
	const int bufferSize = 255;//the max length of input string
	char buffer[bufferSize+1];
	char word[bufferSize+1];
	int wordOffset = 0;

	cout<<"enter a string: ";
	cin.getline(buffer,bufferSize);
	while(getWords(buffer,word,wordOffset)){
		cout<<"got this word: "<< word <<endl;
	}

	return 0;
}
bool getWords(char * string,char * word,int & wordOffset){
	if(!string[wordOffset]){
		return false;
	}
	char *p1, *p2;
	p1=p2=string+wordOffset;
	for(int i=0;i<(int)strlen(p2)&&!isalnum(p1[0]);i++){
		p1++;
	}
	if(!isalnum(p1[0])){
		return false;
	}
	p2=p1;
	while(isalnum(p2[0])){
		p2++;
	}
	int len=int(p2-p1);
	strncpy(word,p1,len);
	word[len]='\0';
	for(int j=int(p2-string);j<(int)strlen(string)&&!isalnum(p2[0]);j++){
		p2++;
	}
	wordOffset=int(p2-string);
	return true;
}

问题出现在第25行,把循环条件定为p1的长度,而p1在遇到非数字或字母的字符时往后移。
当连续的非数字字母字符出现的次数小于总字符串长度的一半时,程序能正常解析;
但当非数字字母字符连续出现的次数大于总字符串长度的一半时,程序无法解析。
正确的做法是,把循环条件i小于p1的长度改为p2的长度。
1
1
分享到:
评论

相关推荐

    21天学通C++(第七版)源代码

    《21天学通C++》是一本广受欢迎的C++编程入门教程,其第七版提供了全面且深入的C++语言学习指导。本书旨在帮助初学者在21天内建立起坚实的C++编程基础,通过实践性的例子和练习,让读者快速掌握C++的核心概念和编程...

    21天学通C++:第4版

    在《21天学通C++:第4版》中,读者还将了解到异常处理,这是处理程序运行时错误的重要机制。此外,文件输入输出(I/O)也是必不可少的一部分,它教会读者如何与外部文件交互,保存和加载数据。 书中的"BookContents...

    21天学通C++(第七版)源代码

    《21天学通C++(第七版)》是一本为初学者精心设计的C++编程教程,由美国作者Siddhartha Rao撰写,并由袁国忠翻译成中文。这本书旨在帮助读者在21天内掌握C++的基础知识,通过实践编程加深理解,从而快速入门。配套...

    21天学通C++(第6版)

    《21天学通C++(第6版)》是一本专为初学者设计的C++编程教程,旨在帮助读者在短短21天内掌握C++的基础知识和核心概念。书中的内容通常会涵盖以下几个重要方面: 1. **C++简介**:C++是由Bjarne Stroustrup在C语言...

    21天学通c++ 习题以及代码

    《21天学通C++》是一本深受学习者欢迎的C++编程教材,它以易懂的语言和实例引导读者逐步掌握C++的基础知识和高级特性。这本书的配套习题和代码是学习过程中不可或缺的部分,它们能帮助读者巩固理论知识,提升实践...

    21天学通C++(第三版) 作者:jesse liberty

    《21天学通C++(第三版)》是由Jesse Liberty编著的一本C++入门教程,适合初学者使用。这本书以其清晰的叙述结构和深入浅出的讲解方式,帮助读者快速掌握C++编程的基础知识,同时也注重培养良好的编程习惯。 C++是...

    21天学通c++(第7版)源代码

    《21天学通C++(第7版)》是一本经典的C++编程教程,旨在帮助初学者在短时间内掌握C++编程语言的核心概念和技术。源代码文件“9780672335679_TYCPP-7E_Code”包含与书中各个章节相对应的实例程序,是学习和理解C++...

    21天学通C++ 本教材简单易懂,通过21天的集中授课方式,把C++的几乎所有知识都由浅入深的讲解一遍,内附大量实际例子,是C++入门及提高的良好教材。

    《21天学通C++》是一本专为初学者设计的C++教程,它以易懂的语言和系统的教学方式,旨在帮助读者在21天内掌握C++的基础到高级知识。C++是一种通用的、面向对象的编程语言,它的强大功能和广泛应用使其成为许多软件...

    21天学会C++及入门教程

    在C++编程语言中,了解和掌握常量和变量的概念及其使用是至关重要的。常量是程序中不可改变的量,它们的值在程序运行期间...通过持续实践和练习,你将在21天的C++学习过程中不断进步,逐步成为一名熟练的C++程序员。

    21天学会C++

    《21天学会C++》是一本针对初学者设计的编程教程,旨在通过21天的学习计划,帮助读者快速掌握C++编程语言的基础知识和核心技能。C++是一种通用的、面向对象的编程语言,由Bjarne Stroustrup于1983年在C语言的基础上...

    21 天学通 C#,国外经典

    例如,List&lt;T&gt;集合类就是泛型的一个例子,T代表任意类型。 4. 构造器与析构器:构造器用于初始化新创建的对象,而析构器则在对象即将被销毁时执行清理工作。 5. 接口:接口定义了一组方法,但不提供实现。类可以...

    21天学通c语言(第6版).rar

    《21天学通C语言(第6版)》是一本深受编程初学者喜爱的教材,旨在帮助读者在短短的21天内掌握C语言的基础知识。C语言是一种强大的、低级的编程语言,它是许多现代编程语言的基础,如C++、C#和Java等。通过学习C语言...

    C++ i21 Days

    《C++ in 21 Days》是一本广受欢迎的C++学习教材,旨在帮助初学者在21天内掌握C++编程基础。本书通过精心设计的教程和实践练习,逐步引导读者深入理解C++语言的核心概念和技术。以下是该书涵盖的一些关键知识点: 1...

    21天让你学会c++的经典书籍

    "21天让你学会C++的经典书籍"显然是为了帮助初学者在短时间内掌握这种语言,通过系统的学习和实践,快速提升编程能力。 学习C++的基础部分包括: 1. **基本语法**:C++的语法与C语言非常相似,包括变量声明、数据...

    C++_visualc++_

    本资源集合是为《21天学通C++》一书配套的源代码,书中通过21天的学习计划,引导初学者逐步掌握C++的基础知识和编程技巧。这些源代码按照书中章节顺序排列,旨在帮助读者更好地理解和实践书中的理论知识,实现从理论...

    mysql5.1中文手册

    perror:解释错误代码&lt;br&gt;8.14. replace:字符串替换实用工具&lt;br&gt;8.15. mysql_zap:杀死符合某一模式的进程&lt;br&gt;9. 语言结构&lt;br&gt;9.1. 文字值&lt;br&gt;9.1.1. 字符串&lt;br&gt;9.1.2. 数值&lt;br&gt;9.1.3. 十六进制值&lt;br&gt;9.1.4. 布尔...

    vcppin21days.rar_Windows编程_Visual_C++_

    《21天学会Visual C++》是一本针对初学者的编程教程,主要涵盖了Windows平台下使用Visual C++进行软件开发的基础知识。通过这本教程,读者可以在21天的学习过程中逐步掌握C++语言以及Microsoft Visual Studio集成...

    Database programming with Visual C++ 6

    ### 数据库编程与Visual C++ 6:21天学习指南 #### 第一部分:数据库技术概览 **第一章:选择正确的数据库技术** 本章重点介绍了如何根据特定的应用需求选择合适的数据库技术。它涵盖了关系型数据库管理系统...

    C#微软培训资料

    &lt;&lt;page 1&gt;&gt; page begin==================== 目 目目 目 录 录录 录 第一部分 C#语言概述.4 第一章 第一章第一章 第一章 .NET 编 编 编程语言 程语言编程语言 程语言 C#.4 1.1 Microsoft...

Global site tag (gtag.js) - Google Analytics