由美国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的长度。
分享到:
相关推荐
perror:解释错误代码<br>8.14. replace:字符串替换实用工具<br>8.15. mysql_zap:杀死符合某一模式的进程<br>9. 语言结构<br>9.1. 文字值<br>9.1.1. 字符串<br>9.1.2. 数值<br>9.1.3. 十六进制值<br>9.1.4. 布尔...
<<page 1>> page begin==================== 目 目目 目 录 录录 录 第一部分 C#语言概述.4 第一章 第一章第一章 第一章 .NET 编 编 编程语言 程语言编程语言 程语言 C#.4 1.1 Microsoft...
i<pSysHead->dbf_coun && i < MAX_DB_NUM; i++) // MAX_DB_NUM=127 这样就保证了循环变量i的值在正常范围内,从而避免了对指针pDBFat进行内存越界的操作。 从上面的测试过程中,我们可以看到:如此严重的问题...
o 7.8 我遇到一些 ``搞笑" 的代码, 包含 5["abcdef"] 这样的 ``表达式"。 这为什么是合法的 C 表达式呢 ? o 7.9 既然数组引用会蜕化为指针, 如果 arr 是数组, 那么 arr 和 &arr 又有什么区别呢 ? o 7.10 我如何...
并在logindlg.cpp 中加入#include <QtGui>的头文件。如果不加这个头文件, QMessageBox 类不可用。 9.这时再执行程序,输入用户名为qt,密码为123456,按登录按钮便能进入主 窗口了,如果输入错了,就会弹出警告...
当我把函数指针赋向void *类型的时候,编译通不过。 51 4.14 怎样在整型和指针之间进行转换?能否暂时把整数放入指针变量中,或者相反? 51 *4.15 我怎样把一个int变量转换为char *型?我试了类型转换,但是不行...
C++ 泛型编程系列讲座之实施 泛型技巧系列:简单类型选择器 C# 泛型简介 我眼中的C#2.0新功能特性 泛型技巧系列:避免基类及接口约束 New Article 不该用Generics实现Abstract Factory的理由 C#2.0-泛型 C#2.0-...
当我把函数指针赋向void*类型的时候,编译通不过。 4.14 怎样在整型和指针之间进行转换?能否暂时把整数放入指针变量中,或者相反? *4.15 我怎样把一个int变量转换为char*型?我试了类型转换,但是不行。 第5...
但是编译器报了错误信 息。难道在C语言中一个结构不能包含指向自己的指针吗? . . . . 3 1.7 怎样建立和理解非常复杂的声明?例如定义一个包含N 个指向返 回指向字符的指针的函数的指针的数组? . . . . . . . . . ...
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. 位字段值 ...
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. 位字段值 ...
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. ...
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. 位...
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. 位字段值 ...
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. 位字段值 ...
目录 前言 1. 一般信息 1.1. 关于本手册 ...8.13. perror:解释错误代码 8.14. replace:字符串替换实用工具 8.15. mysql_zap:杀死符合某一模式的进程 9. 语言结构 9.1. 文字值 9.1.1. 字符串 9.1.2. 数值 ...