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。

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

我感谢您的帮助..

4

4 回答 4

3

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

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

这可能会导致访问冲突,因为字符串"longer than 5"可能在只读内存中。(这不是必须的,但现代编译器可能会这样做。)

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

编辑:如果你想sprintf_s从函数中获取你正在生成的字符串,你有几个选择。

  1. 您可以添加带有缓冲区的第二个参数以将字符串打印到其中。char output[1001]您可以将此指针传递给您,而不是在堆栈(您的)上声明缓冲区。IE。你的函数原型变成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:如果您相信约翰·卡马克(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;
}

我想你可以更进一步让它 return const bool,除了函数的返回值已经是一个右值......

于 2013-07-02T08:54:40.623 回答
1

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

做这件事有很多种方法:

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

依此类推,使用哪一个取决于您的使用语义。

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

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

于 2013-07-02T08:52:45.647 回答
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或者这个定义

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

 inString = "length is " + SSTR(size);
于 2013-07-02T09:18:50.803 回答
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;
}
于 2013-07-02T09:24:19.587 回答