我在C++中有一个使用std :: string和std :: wstring的MFC应用程序,并经常从一个转换为另一个,还有很多其他的废话.我需要将所有内容标准化为单一格式,所以我想知道是否应该使用CString或std :: wstring.
在应用程序中,我需要从字符串表生成字符串,处理大量需要常量tchar或wchar_t指针的Windows调用,编辑控件,并与需要BSTR的COM对象API进行交互.
我也有字符串向量,所以CStrings向量有什么问题吗?
哪一个更好?各自的优点和缺点是什么?
例子
BSTR到wstring
CComBSTR tstr;
wstring album;
if( (trk->get_Info((BSTR *)&tstr)) == S_OK && tstr!= NULL)
album = (wstring)tstr;
Run Code Online (Sandbox Code Playgroud)
wstring到BSTR
CComBSTR tstr = path.c_str();
if(trk->set_Info(tstr) == S_OK)
return true;
Run Code Online (Sandbox Code Playgroud)
字符串资源到wstring
CString t;
wstring url;
t.LoadString(IDS_SCRIPTURL);
url = t;
Run Code Online (Sandbox Code Playgroud)
GetProfileString()返回一个CString.
整数到字符串格式:
wchar_t total[32];
swprintf_s(total, 32, L"%d", trk->getInt());
wstring tot(total);
Run Code Online (Sandbox Code Playgroud) 我正在尝试加密我在打开网址时正在制作的游戏上的查询字符串.它并不复杂,实际上因为我在游戏引擎上工作所以它需要尽可能简单.如果我的等级过低,往往会大惊小怪.
我已经创建了查询字符串,我只需要获取它的每个字符并从字符中减去15以轻微加密它.我只是想做一个能阻止大多数用户的简单加密.
我希望我能给出一个代码示例,但我对C没有太多经验,我甚至不确定从哪里开始.游戏引擎的api通常会让一切变得简单.
是否有可能以某种方式调整c风格的字符串/缓冲区(char*或wchar_t*)以使用Boost字符串算法库?
也就是说,例如,它的trim算法具有以下声明:
template<typename SequenceT>
void trim(SequenceT &, const std::locale & = std::locale());
Run Code Online (Sandbox Code Playgroud)
并且实现(查找trim_left_if)要求序列类型具有成员函数erase.
我怎么能用原始字符指针/ c字符串缓冲区?
char* pStr = getSomeCString(); // example, could also be something like wchar_t buf[256];
...
boost::trim(pStr); // HOW?
Run Code Online (Sandbox Code Playgroud)
理想情况下,算法可以直接在提供的缓冲区上工作.(尽可能.如果算法需要在"字符串"中分配额外的空间,它显然无法工作.)
@Vitaly问道:为什么你不能从char缓冲区创建一个std :: string然后在算法中使用它?
我有char*的原因是我想在我们现有的代码库上使用一些algorthims.将所有char缓冲区重构为字符串将比其值更多的工作,并且在更改或调整某些内容时,能够将给定算法应用于恰好存在于当前代码中的任何c样式字符串将是一件好事.
使用字符串意味着(a)将char*复制到字符串,(b)将算法应用于字符串,以及(c)将字符串复制回char缓冲区.
我正在读取文件并解析其内容.我需要确保一个CString值只包含数字.我能实现的不同方法有哪些?
示例代码:
Cstring Validate(CString str)
{
if(/*condition to check whether its all numeric data in the string*/)
{
return " string only numeric characters";
}
else
{
return "string contains non numeric characters";
}
}
Run Code Online (Sandbox Code Playgroud) 通过我在网上找到的一些编程访谈挑战,我不得不编写一个算法来反转一个const char*并返回一个指向新char*的指针.我想我已经拥有它,但是为了让它正常工作,我不得不做一些不稳定的事情 - 基本上我必须自己考虑一个空终止的角色.不知怎的,我觉得这是错的,但我很难过,我想知道是否有人可以帮助我:
char * reverse(const char * str)
{
int length = strlen(str);
char * reversed_string = new char[length+1];
for(int i = 0; i < length; ++i)
{
reversed_string[i] = str[(length-1) - i];
}
//need to null terminate the string
reversed_string[length] = '\0';
return reversed_string;
}
int main(int argc, char * argv[])
{
char * rev_str = reverse("Testing");
cout << "Your string reversed is this: " << rev_str << endl;
delete rev_str;
rev_str = 0;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用win32检索环境变量GetEnvironmentStrings().它返回一个char*.
我想搜索这个字符串(字符串指针)的特定环境变量(是的,我知道我可以使用,GetEnvironmentVariable()但我这样做,因为我也想在控制台上打印所有的环境变量 - 我只是摆弄) .
所以我想我会转换char*为std :: string并使用find(我知道我也可以使用c_string find函数,但我更关心的是尝试将a复制char*到a中std::string).但是下面的代码似乎并没有将所有内容复制char*到std::string(它让我觉得有一个\0字符,char*但它实际上并不是结束).
char* a = GetEnvironmentStrings();
string b = string(a, sizeof(a));
printf( "%s", b.c_str() ); // prints =::=
Run Code Online (Sandbox Code Playgroud)
有没有办法将a复制char*到a std::string(我知道我可以strcpy()用来复制const char*到字符串而不是a char*).
我得到了奇怪的seg错误,这似乎是来自某个不在我的程序中的地方......无论如何都没有明确说明.我在两个数组上调用"strcmp"...两个数组都存储在相同类型的结构中.我用点符号得到一个,用" - >"取消引用一个:
int name = strcmp(one.name, two->name);
Run Code Online (Sandbox Code Playgroud)
它编译得很好但是当我运行它时我得到了seg错误.我尝试用GDB跟踪它,但是当我在我认为它应该发生之前放置断点时,无论如何它都会出现故障.我越来越:
Program received signal SIGSEGV, Segmentation fault.
__strcmp_ia32 () at ../sysdeps/i386/i686/multiarch/../strcmp.S:40
40 ../sysdeps/i386/i686/multiarch/../strcmp.S: No such file or directory.
in ../sysdeps/i386/i686/multiarch/../strcmp.S
Run Code Online (Sandbox Code Playgroud)
FML.建议?谢谢!
我正在编写一个类似于std :: string的字符串类作为家庭作业,但我无法弄清楚如何返回一个不会导致内存泄漏的c字符串,并保证保持不变直到它不存在使用时间更长.我目前有:
const char* string::c_str()
{
char c[_size+1];
strncpy(c,_data,_size);
c[_size]='\0';
return c;
}
Run Code Online (Sandbox Code Playgroud)
但是在调用之后不久就会覆盖内容.如果我进行动态分配,我会有内存泄漏,或者任何时候只能从给定的字符串中存在一个c字符串.我怎么能避免这个?
因此,在尝试学习如何在C++中使用C-Strings时,我遇到了内存分配问题.
这里的想法是创建一个新的字符串格式(s1 + sep + s2)我正在使用的文本提供了标题,所以我不能改变它,但我遇到了试图设置大小的问题char str [].我收到一个错误,说sLength不是常量,因此不能用于设置数组的大小.我对C++比较陌生,所以这是一个两部分问题.
这个策略实际上是为新阵列分配内存吗?
如果使用strlen(char*)无法获得常量值,如何正确设置数组大小?
char* concatStrings(char* s1, char* s2, char sep){
int sLength = strlen(s1) + strlen(s2) + 3;
//+1 for char sep +2 for \0 at end of string
char *str = new char[sLength];
strcpy (str, s1);
str [sLength(s1)] = sep;
strcat (str, s2);
return str;
}
Run Code Online (Sandbox Code Playgroud)编辑,所以现在我没有编译错误,但...
对函数的调用如下:
char* str = concatStrings("Here is String one", "Here is String two" , c);
cout<< str;
Run Code Online (Sandbox Code Playgroud)
我的输出成为:
这里是String onec ================== 22221/21/21/21/2/(等) /这里是String 2