返回布尔函数的值,并将指针作为参数传递
return value of a bool function and passed pointer as parameter
我是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
生成的字符串,你有几个选项。
- 您可以添加第二个带有缓冲区的参数来将字符串打印到其中。您可以将此指针传递给自己,而不是在堆栈上声明缓冲区(
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:如果你相信约翰·卡马克的坚持,你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);
- 使用指向成员的指针将成员函数作为参数传递
- 修改函数中的指针(将另一个指针作为参数传递)
- 将成员函数指针作为参数传递给模板方法
- 使用引用与指针将数组作为参数传递
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 将函数指针数组中的函数指针作为模板参数传递
- 为什么或在什么情况下,你会将参数作为C++中的引用(或指针)传递给函数?
- 无法将指向类的成员函数的函数指针作为参数传递给同一类的另一个成员函数
- 如何将指针变量作为引用参数传递?
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- Qt5 - 如何将"QList<T> *"指针作为信号参数传递,并在完成后将其删除?
- C++将指向成员的指针作为模板参数传递
- 通过引用函数传递指针参数是什么意思?
- C++ 将派生类的成员函数指针作为参数传递时选择了错误的模板专用化
- 将函数指针作为函数参数传递的目的
- 将派生类作为参数传递给方法,该方法是具有智能指针的基类
- 将指针参数传递给双指针参数
- 解析结构并作为指针参数传递
- Qt中的2D游戏:初始化怪物并将动态分配的数组作为指针参数传递