返回bool函数的值并将指针作为参数传递

时间:2013-07-02 08:48:19

标签: c++ visual-c++

我是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;

}

除了函数之外,我试图获得“输出”值来调用此函数在此函数内定义的局部之外,该函数具有值 - “length is - ”

我试过

 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)字符串语句“output”?

感谢您的帮助..

4 个答案:

答案 0 :(得分: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. 将输出缓冲区移动到文件范围数组。那甚至更加丑陋。
  4. 上面#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:如果你相信John Carmack坚持你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,除了函数的返回值已经是右值...

答案 1 :(得分:1)

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

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

  • 动态分配内存
  • static storage

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

您只需将输出字符串作为函数参数传递。由于您希望在函数内部分配字符串,因此需要通过引用传递指针。

在旁注中,请考虑使用std::string而不是char *

答案 2 :(得分: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);

答案 3 :(得分: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;
}