2013-07-02 45 views
0

我是C++的新手,无法为函数的char *赋值。我有一个函数如下返回布尔bool函数的返回值和传递的指针作为参数

bool Function(char* inString) 
{ 
     int m = strlen(inString); 
    char output[1001]; 
    memset(output , 0 , sizeof(output)); 
    sprintf_s(output,50,"length is %d",m); 

     if(m>5) 
     return true; 
    if(m<5) 
     return false; 

} 

随着功能,我试图让调用这个函数之外定义该功能具有价值内部本地“输出”价值 - “长 - ”

我试着做

bool Function(char* inString) 
{ 
int m = strlen(inString); 
    char output[1001]; 
    memset(output , 0 , sizeof(output)); 
    sprintf_s(output,50,"length is %d",m); 
    sprintf_s(inString,50,output); 
    if(m>5) 
      return true; 
     if(m<5) 
      return false; 
} 

但这种失败,因为inString早已值,这是给下面的错误 访问冲突写入位置0x00165267。

有没有什么办法从这个函数(基于字符串长度的bool值)以及b)字符串语句“输出”获取这两个参数?

我很感谢你的帮助..

+1

如果'm == 5'?您的功能不包括所有可能性的退货。 –

+0

m == 5显然没有找到文件:http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx –

+0

如果是C++,请避免C字符串和(通常)指针。 – Roddy

回答

3

你是如何调用这个函数?如果您使用字符串文字来调用它,那么该字符串文字可能在只读内存中。例如,这将失败:

bool result = Function("longer than 5"); 

这很可能会导致访问冲突,因为该字符串"longer than 5"很可能在只读存储器中。 (它不是必须的,但它可能与现代编译器一起使用。)

另外,正如Alexandru在上面指出的那样,您根本没有处理m == 5的情况。

编辑:如果你想得到你在sprintf_s以外生成的字符串,你有几个选项。

  1. 您可以添加第二个参数与缓冲区打印字符串。你可以不用在栈上声明一个缓冲区(你的char output[1001]),而是把这个指针传给你。即。您的函数原型变为bool Function(char *inString, char *outString);
  2. 使您的缓冲区为static,然后通过引用返回指向它的指针。这需要您添加第二个操作数。这一点有点丑陋:bool Function(char *inString, char **outString);然后,在你的代码中,你会说*outString = output,坦率地说,这很糟糕。
  3. 将输出缓冲区移至文件范围数组。这更丑陋。

一个以上#1的优点是,你可以使用默认参数,有一个if语句,使sprintf可选:

bool Function(char *inString, char *outString = 0) 
{ 
    int m = strlen(inString); 

    if (outString) 
     sprintf_s(outString, 50, "length is %d", m); 

    return m >= 5; 
} 

此外,文体注:不想char *inStringchar* inString。在C和C++中,星号不是要声明的类型的一部分,而是要声明的单个符号的修饰符。如果要声明两个字符指针ab,则需要编写char *a, *b而不是char* a, b

编辑2:如果你相信约翰·卡马克的坚持,你const任何可能const,那么上面就变成了:

bool Function(const char *const inString, char *const outString = 0) 
{ 
    const int m = strlen(inString); 

    if (outString) 
     sprintf_s(outString, 50, "length is %d", m); 

    return m >= 5; 
} 

我想你可以走的更远,并使其返回const bool,除了函数的返回值已经是一个右值...

+0

'return m> = 5;' – Roddy

+0

是的,大多数编译器会捕获并优化它。不过,我会继续编辑上面的答案。 –

+1

如果你发现一个*不*优化的编译器,那么该把编译器丢掉了。但Roddy的建议不是性能优化,而是可读性*优化。 –

1

能够从函数返回一个字符串。即使在退出函数后,仍然需要以这种方式分配字符串。您的示例将字符串存储在本地数组(output)中,该数组并不超出函数的作用域({ })。

有几种方法可以做到这一点:

  • 动态分配的内存
  • static存储

等,使用哪一个取决于您的使用语义。

您只需要将输出字符串作为函数参数传递。既然你想在函数内部分配字符串,你需要通过引用传递一个指针。

在一个侧面说明,请考虑使用std::string代替char *

0

由于您使用C++,你应该这样做

bool Function(std::string &inString, std::string &outString) 
{ 
    size_t size = inString.size(); 
    outString = "length is " + std::to_string(size); //if c++11 
    if (size > 5) 
      return true; 
    return false; 
} 

到您的size_t转换为C字符串++,你可以使用boost::lexical_cast或本define

#include <sstream> 
#define SSTR(x) dynamic_cast< std::ostringstream & >((std::ostringstream() << std::dec << x)).str() 

inString = "length is " + SSTR(size); 
0

你的代码是不是真的C++,这是C.

这里是你应该怎么做它在C++。请注意使用引用而不是指针。

bool Function(const std::string &inString, std::string &outString) 
{ 
    int m = inString.size(); 

    std::stringstream ss; 
    ss << "length is" << m; 

    outString = ss.str(); 

    return m >= 5; 
}