返回布尔函数的值,并将指针作为参数传递

return value of a bool function and passed pointer as parameter

本文关键字:指针 参数传递 布尔 函数 返回      更新时间:2023-10-16

我是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时发生访问冲突。

有没有办法从这个函数中获得两个参数(基于字符串长度的布尔值)以及b)字符串语句"output"?

我感谢你的帮助。。

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

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* inString,更喜欢char *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,除了函数的返回值已经是一个右值。。。

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

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

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

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

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

附带说明一下,考虑使用std::string而不是char *

您的代码不是真正的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;
}

由于您使用的是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;
}

要在C++中将size_t转换为字符串,可以使用boost::lexical_cast或定义

#include <sstream>
#define SSTR( x ) dynamic_cast< std::ostringstream & >(( std::ostringstream() << std::dec << x ) ).str()
 inString = "length is " + SSTR(size);