C++语言99个常见编程错误 常见错误32:对以指涉物为指向常量的指针类型的类型为目标类型的类型转换的认识误区

常见错误32:对以指涉物为指向常量的指针类型的类型为目标类型的类型转换的认识误区
  对目标类型为指涉物为常量的指针类型的类型的类型转换适应的令热愉悦的平凡情形对于
目标类型为指涉物为指向常量的指针类型的(包括指涉级数多于2级,且最终指涉物为常量
的指针类型的)类型转换而言就失灵了。考虑把一个指涉物为指向char类型(非常量)的指针
转换成一个指涉物为指向char常量类型的指针的尝试:


使用引用类型或标准库组件以避免引入多级指针的复杂性,通常来说是比较好的设计


gettken.cpp
#include <iostream>

// 只定义下列中的一个
//#define PTRPTR
#define REFPTR

#ifdef PTRPTR

// get_token 返回一个指针,指向被ws指向的字符串分隔的 区纽的下一个
//参数中的指针被更改为指向返回的语汇单元之后的那个位置
char *get_token( char **s, char *ws = " \t\n" ) {
    char *p;
    do
        for( p = ws; *p && **s != *p; p++ );
    while( *p ? *(*s)++ : 0 );
    char *ret = *s;
    do
        for( p = ws; *p && **s != *p; p++ );
    while( *p ? 0 : **s ? (*s)++ : 0 );
    if( **s ) {
    	**s = '\0';
    	++*s;
    }
    return ret;
}

#endif

#ifdef REFPTR

char *get_token( char *&s, char *ws = " \t\n" ) {
    char *p;
    do
        for( p = ws; *p && *s != *p; p++ ); 
    while( *p ? *s++ : 0 );
    char *ret = s;
    do
        for( p = ws; *p && *s != *p; p++ );
    while( *p ? 0 : *s ? s++ : 0 );
    if( *s ) *s++ = '\0';
    return ret;
}

#endif

extern char *getInputBuffer() {
	static char buf[] = "this is an input buffer";
	return buf;
}

int main() {
	char *tokens = getInputBuffer();
	std::cout << "Input buffer: |" << tokens << "|" << std::endl;
	//...
	while( *tokens )
#ifdef PTRPTR
    	std::cout << "token: |" << get_token( &tokens ) << '|' << std::endl;
#endif
#ifdef REFPTR
    	std::cout << "token: |" << get_token( tokens ) << '|' << std::endl;
#endif
    
    return 0;
}


输出
Input buffer: |this is an input buffer|
token: |this|
token: |is|
token: |an|
token: |input|
token: |buffer|

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值