`
hoary20
  • 浏览: 136728 次
  • 性别: 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
分享到:
评论

相关推荐

    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. 布尔...

    C#微软培训资料

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

    华为编程开发规范与案例

    i&lt;pSysHead-&gt;dbf_coun && i &lt; MAX_DB_NUM; i++) // MAX_DB_NUM=127 这样就保证了循环变量i的值在正常范围内,从而避免了对指针pDBFat进行内存越界的操作。  从上面的测试过程中,我们可以看到:如此严重的问题...

    C语言FAQ 常见问题列表

    o 7.8 我遇到一些 ``搞笑" 的代码, 包含 5["abcdef"] 这样的 ``表达式"。 这为什么是合法的 C 表达式呢 ? o 7.9 既然数组引用会蜕化为指针, 如果 arr 是数组, 那么 arr 和 &arr 又有什么区别呢 ? o 7.10 我如何...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    并在logindlg.cpp 中加入#include &lt;QtGui&gt;的头文件。如果不加这个头文件, QMessageBox 类不可用。 9.这时再执行程序,输入用户名为qt,密码为123456,按登录按钮便能进入主 窗口了,如果输入错了,就会弹出警告...

    《你必须知道的495个C语言问题》

    当我把函数指针赋向void *类型的时候,编译通不过。 51 4.14 怎样在整型和指针之间进行转换?能否暂时把整数放入指针变量中,或者相反? 51 *4.15 我怎样把一个int变量转换为char *型?我试了类型转换,但是不行...

    asp.net知识库

    C++ 泛型编程系列讲座之实施 泛型技巧系列:简单类型选择器 C# 泛型简介 我眼中的C#2.0新功能特性 泛型技巧系列:避免基类及接口约束 New Article 不该用Generics实现Abstract Factory的理由 C#2.0-泛型 C#2.0-...

    你必须知道的495个C语言问题

    当我把函数指针赋向void*类型的时候,编译通不过。 4.14 怎样在整型和指针之间进行转换?能否暂时把整数放入指针变量中,或者相反? *4.15 我怎样把一个int变量转换为char*型?我试了类型转换,但是不行。 第5...

    你必须知道的495个C语言问题(PDF)

    但是编译器报了错误信 息。难道在C语言中一个结构不能包含指向自己的指针吗? . . . . 3 1.7 怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返 回指向字符的指针的函数的指针的数组? . . . . . . . . . ...

    MySQL 5.1参考手册 (中文版)

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

    mysql官方中文参考手册

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

    MYSQL中文手册

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

    MySQL 5.1参考手册中文版

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

    MySQL 5.1参考手册

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

    MySQL5.1参考手册官方简体中文版

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

    MySQL 5.1官方简体中文参考手册

    目录 前言 1. 一般信息 1.1. 关于本手册 ...8.13. perror:解释错误代码 8.14. replace:字符串替换实用工具 8.15. mysql_zap:杀死符合某一模式的进程 9. 语言结构 9.1. 文字值 9.1.1. 字符串 9.1.2. 数值 ...

Global site tag (gtag.js) - Google Analytics