2010-04-30 58 views
0
class MyClass 
{ 
public: 
    void setVar(const char *str); 
private: 
    std::string mStr; 
    int maxLength; //we only store string up to this length 
}; 

什么是执行SETVAR当外部代码很可能在NULL传递一个空字符串(最好的办法,不能改变)?我目前做的有点像:最佳方式来处理存储在STD(可能为null)的char * :: string的

void MyClass::setVar(const char *str) 
{ 
mStr.assign(str ? str : "",maxLength); 
} 

但它似乎有点混乱。想法?

+0

假设str是空终止的:假设你将读取其他地方的字符串值。这段代码是否需要一个“char const *”或“string”? – Thomas 2010-04-30 10:47:54

+0

你认为它是如何凌乱? – 2010-04-30 10:49:34

+0

@Thomas,你为什么要问?我认为无论哪种方式,最好是我的新类使用STL ...实际上,我将它从存储C字符串转换而来,因为它使复制对象更加容易出错......添加了新字段,并且默认情况下不会复制! – 2010-04-30 10:57:34

回答

4

您发布的代码是不正确的,因为它总是会从源字符串读maxLength字符。特别是,这意味着当str为NULL时,它将读取超过空字符串的末尾。假设str为空终止:

void MyClass::setVar(const char *str) 
{ 
    if (str==NULL) 
     mStr.clear(); 
    else 
     mStr.assign(str, std::min(strlen(str), maxLength)); 
} 
+0

是的,我刚刚意识到在调试string :: assign不工作,我的预期。 – 2010-04-30 10:56:16

2
void MyClass::setVar(const char *str) 
{ 
    if (str) { 
     mStr.assign(str, str + std::min(strlen(str), maxLength)); 
    } else { 
     mStr = ""; 
    } 
} 
+0

什么是_str + _ std :: min ... – 2010-04-30 13:18:20