该函数char* strrchr(const char *str, int ch)返回()中最后一次出现的指针(char*).strconst char *ch
所以我们可以编写以下代码而不需要任何转换:
#include <string.h>
int main()
{
const char CONSTSTR[] = "foo/bar/foobar.txt";
char *ptr = strrchr (CONSTSTR, '/');
*ptr++ = 'B';
*ptr++ = 'A';
*ptr++ = 'D';
}
Run Code Online (Sandbox Code Playgroud)
返回的优势char*是const char*什么?
编辑:
正如Shafik Yaghmour指出的那样,strchr实现如何工作有很好的答案?
由于我的代码是在C++中,我将使用<cstring>而不是<string.h>.谢谢你的回答;-)
然而,Mike Seymour的答案最适合这个问题.我甚至在下面添加了一个更详细的答案,清楚地说strrchr()是一个C函数(不允许重载),声明适合const和非const字符串.因为strrchr()可以使用非const字符串调用,所以返回的字符串也应该是非const …
在C++中,如果我想定义一些可以在不同的类,函数,文件中使用的非本地const字符串,我所知道的方法是:
使用define指令,例如
#define STR_VALUE "some_string_value"
Run Code Online (Sandbox Code Playgroud)const类成员变量,例如
class Demo {
public:
static const std::string ConstStrVal;
};
// then in cpp
std::string Demo::ConstStrVal = "some_string_value";
Run Code Online (Sandbox Code Playgroud)const类成员函数,例如
class Demo{
public:
static const std::string GetValue(){return "some_string_value";}
};
Run Code Online (Sandbox Code Playgroud)现在我不清楚的是,如果我们使用第二种方法,变量ConstStrVal在任何情况下被任何代码实际使用之前总是初始化为"some_string_value"吗?因为"静态初始化命令惨败",我担心这个.如果这个问题有效,为什么每个人都使用第二种方法?
哪种方法最好,2或3?我知道#define指令不尊重范围,大多数人不推荐它.
谢谢!
我正在尝试看起来不错的const_string lib,但它在运行时因访问冲突而崩溃(atomic_count,operator ++()).测试代码:
#include <boost/const_string/const_string.hpp>
#include <boost/const_string/concatenation.hpp>
typedef boost::const_string<wchar_t> wcstring;
class Test
{
private:
const wcstring &s1;
const wcstring &s2;
public:
Test()
: s1(L"")
, s2(L"")
{
}
const wcstring &GetS1()
{
return s1;
}
const wcstring &GetS2()
{
return s2;
}
};
Test t;
int _tmain(int argc, _TCHAR* argv[])
{
//Test t;
wcstring t1 = t.GetS1(); // crashes here
wcstring t2 = t.GetS2();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
只有当t是全局的时候它才会崩溃.如果我将声明移动到main(),那没关系.系统:VS 2010,升级版本1.47.0
问题:我做错了什么或是库/编译器的问题?有人可以为C++推荐更稳定的不可变字符串实现吗?