如何判断一个char * 的字符串为空?

B2China 2004-09-01 04:01:29
我用VC写了一个函数,问题在注释里面:

void CFastSmtp::SetPassword(const char Password[])
{
assert(Password);
int s=strlen(Password);

/***************************************************************************/
/* m_pcPassword 是CFastSmtp类的一个私有成员:private char * m_pcPassword; */
/* 这里用if(m_pcPassword) 不能判断m_pcPassword是否为空,因为我单步调试时 */
/* 发现尽管m_pcPassword为空,但是后面的delete语句仍然执行了,用strlen判断 */
/* 也不行,用if(m_pcPassword!=0) &&if(m_pcPassword!=NULL)也不行,怎么判断? */
/***************************************************************************/
if (m_pcPassword)
delete [] m_pcPassword;

m_pcPassword = new char[s+1];
strcpy(m_pcPassword, Password);
}

怎么才是正确有效的判断方法呢?
...全文
3075 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
B2China 2004-09-01
  • 打赏
  • 举报
回复
goodboy1881(三井)(为了更好的BS JAVA而学习JAVA中)
--------------------------------------------------
是的,你的那个语法是正确的,出错的原因就是我的成员变量初始化错了。
积木 2004-09-01
  • 打赏
  • 举报
回复
to B2China(海陆空天电磁)
首先是我多写了一个=,剩下的我认为没有什么问题,
assert(Password!==NULL&&Password[0]!='\0')
因Password!=NULL所以这个判别式已经为false,所以这个表达式一定为false,根据短路求值,后面的表达式不会被计算。
healer_kx 2004-09-01
  • 打赏
  • 举报
回复
原因是你没有一个好的习惯,
类的成员要初始化一下好不好? 特别是指针变量。
实例无论实在堆还是栈,哪里那么好就是NULL??
你初始一下不就行了?
B2China 2004-09-01
  • 打赏
  • 举报
回复
goodboy1881(三井)(为了更好的BS JAVA而学习JAVA中)

assert(Password!==NULL&&Password[0]!='\0')
--------------------------------------
这个不行,因为Password是空的,访问它的第一个位置的字符引起Access vialation 错误


darkstar21cn(星之魄)(我是你的)
m_pcPassword为空,并不等同于m_pcPassword为NULL,
----------------------------------------
是的。

空字符串指的是"\n",它还是占用空间的,需要delete
----------------------------------------
空字符串用""表示的吧?


ntxs(亡灵巫师)
----------------------------------
我仔细的检查了一下,发现由于我这个成员变量是临时添加进去的,没有在构造函数
里面对它进行初始化,因此出现错误,你说的是对的。
在CFastSmtp的构造函数里面添加一个成员变量初始化的语句就可以了。

m_pcPassord = NULL;



ntxs 2004-09-01
  • 打赏
  • 举报
回复
看看你的构造函数看看?

是否有给 m_pcPassword = 0 了呢?

m_pcPassword 是new出来的吗? 是的话就要delete,无论它空不空。
指针本身也是占内存的。

一般遇到这样的情况,我都会用string来代替 char* ,方便多了。
darkstar21cn 2004-09-01
  • 打赏
  • 举报
回复
m_pcPassword为空,并不等同于m_pcPassword为NULL,
空字符串指的是"\n",它还是占用空间的,需要delete
m_pcPassword为NULL,它就是没有分配空间的一个指针,不用delete
积木 2004-09-01
  • 打赏
  • 举报
回复
一个简单的做法就是直接判断这个指针为NULL。
那么调用的时候这个指针要不指向一个串,要么不指。
然后再判断这个指针指向的串的第一个元素是不是'\0',如果是它也算是空串。我想做到这两个就可以了,所以写出的语句就是如下的

assert(Password!==NULL&&Password[0]!='\0')

我认为这个断言就足够了

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧