我是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”?
感谢您的帮助..
答案 0 :(得分:3)
你是怎么称呼这个功能的?如果您使用字符串文字调用它,那么该字符串文字可能在只读内存中。例如,这将失败:
bool result = Function( "longer than 5" );
这可能会导致访问冲突,因为字符串"longer than 5"
可能在只读内存中。 (这不是必须的,但它可能与现代编译器有关。)
另外,正如Alexandru上面指出的那样,你根本没有处理m == 5的情况。
编辑:如果你想从函数中获取用sprintf_s
生成的字符串,你有几个选项。
char output[1001]
)。即。您的函数原型变为bool Function(char *inString, char *outString);
static
,然后通过引用返回指向它的指针。这需要您添加第二个操作数。这个有点丑陋:bool Function(char *inString, char **outString);
然后,在你的代码中你会说*outString = output
,坦率地说,这是粗略的。上面#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 ++中,星号不是所声明类型的一部分,而是声明的单个符号的修饰符。如果要声明两个字符指针a
和b
,则编写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;
}