很抱歉在SO上开始另一个无法回答的问题,但我只是好奇C++中所有不同字符串类型的优缺点.我的特殊问题是在MFC的CStrings和std :: string之间(因为我只使用Windows软件),但这会延伸到C++中的任何字符串格式.你在C++中使用的最佳字符串类型是什么?为什么?
更新:我实际上发现了一个重复的问题.感谢那些已经回答的人.请指出对这个问题的任何新回复: 如何处理C++中的字符串?
到目前为止,我发现我可以用两种(多种?)方式将传入的BSTR转换为ANSI,我很想知道在速度/效率等方面是否比另一种"更好".
我一直使用的方式是使用USES_CONVERSION和W2A宏,例如
BSTR __stdcall F(BSTR p1, BSTR p2 ) {
USES_CONVERSION;
LPSTR sNum1 = W2A( p1 );
LPSTR sNum2 = W2A( p2 );
Run Code Online (Sandbox Code Playgroud)
然而,最近我遇到了另一种技术:
BSTR __stdcall F(BSTR p1, BSTR p2 ) {
long amt = wcstombs( NULL, p1, 1 );
sNum1 = (char *) malloc( amt );
wcstombs( sNum1, p1, amt );
*(sNum1 + amt) = '\0';
amt = wcstombs( NULL, p2, 1 );
sNum2 = (char *) malloc( amt );
wcstombs( sNum2, p2, amt ); …Run Code Online (Sandbox Code Playgroud) 出于教育目的,我在一些测试程序中使用cstrings.我想用占位符缩短字符串,例如"......".
也就是说,如果我的最大长度设置为13 ,"Quite a long string"则会变为"Quite a lo..."13.此外,我不想破坏原始字符串 - 因此缩短的字符串必须是副本.
下面的(静态)方法是我提出的.我的问题是:为类缩短的字符串分配内存的类是否也应该负责释放它? 我现在所做的是将返回的字符串存储在单独的"用户类"中,并将内存释放到该用户类.
const char* TextHelper::shortenWithPlaceholder(const char* text, size_t newSize) {
char* shortened = new char[newSize+1];
if (newSize <= 3) {
strncpy_s(shortened, newSize+1, ".", newSize);
}
else {
strncpy_s(shortened, newSize+1, text, newSize-3);
strncat_s(shortened, newSize+1, "...", 3);
}
return shortened;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试更改一些遗留代码.我需要填写一个char[] ext使用的文件扩展名filename.Right(3).问题是我不知道如何从a转换CStringT为a char[].
必须有一个非常简单的解决方案,我只是没有意识到......
TIA.
这段代码编译得很好,但在运行时会出现分段错误错误?有谁能说出原因?
#include <stdio.h>
#include <string.h>
#include <math.h>
int main() {
const char s2[] = "asdfasdf";
char* s1;
strcpy(s1, s2);
printf("%s", s1);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我使用CString收到链接器错误,错误是:
error LNK2001: unresolved external symbol "private: static class ATL::CStringT<wchar_t,class StrTraitMFC<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > CConfiguration::_campaignFolderPath" (?_campaignFolderPath@CConfiguration@@0V?$CStringT@_WV?$StrTraitMFC@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@A)
Run Code Online (Sandbox Code Playgroud)
我有一个类定义为:
class CConfiguration
{
private:
static CString _campaignFolderPath;
public:
static void Read();
private:
CConfiguration(void);
~CConfiguration(void);
};
Run Code Online (Sandbox Code Playgroud)
其Read方法定义为:
void CConfiguration::Read()
{
CConfigFile configReader(_T("Config.ini"));
TCHAR temp[1024];
configReader.GetStringValue(_T("Campaigns"), _T("CampaignsFolderPath"), temp);
_campaignFolderPath = temp;
}
Run Code Online (Sandbox Code Playgroud)
有关导致错误的原因的任何线索?我正在使用Visual Studio 2008
char sXSongBuffer[20][30];
sXSongBuffer = {"Thriller", "Don't Stop Till You Get Enough", "Billy Jean"};
Run Code Online (Sandbox Code Playgroud)
为什么会返回错误expected expression before ‘{’ token?我想这样初始化我的数组的原因是我可以在以后改变它的内容:
sXSongBuffer = {"New Song", "More Music From Me"};
Run Code Online (Sandbox Code Playgroud) 好吧,所以我试图在C++中反转一个C风格的字符串,我正在寻找一些奇怪的输出.也许有人能说出一些亮点?
这是我的代码:
int main(){
char str[] = "string";
int strSize = sizeof(str)/sizeof(char);
char str2[strSize];
int n = strSize-1;
int i =0;
while (&str+n >= &str){
str2[i] = *(str+n);
n--;
i++;
}
int str2size = sizeof(str)/sizeof(char);
int x;
for(x=0;x<str2size;x++){
cout << str2[x];
}
}
Run Code Online (Sandbox Code Playgroud)
这里的基本思想是将指针指向字符串的结尾,然后使用指针算法将其向后读入新数组.
在这种特殊情况下,我得到一个输出:"gnirts"在任何输出的开头有一个烦人的空间,我假设是空字符?但是当我试图通过递减strSize变量来排除它时,我最终在字符串另一端的一些其他字符可能来自另一个内存块.
有关如何避免这种情况的任何想法?PS :(你们会认为这是扭转字符串的好主意吗?)
简单问题:
如何使用尽可能少的代码返回空C-String?
我有需要返回空的代码char*.我正在寻找一些类似的东西return "";.我知道有几种方法可以做到这一点,但我正在寻找最有效的方法.
使用return "";给出warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
谢谢!
我无法转换int为c-string(const char*):
int filenameIndex = 1;
stringstream temp_str;
temp_str<<(fileNameIndex);
const char* cstr2 = temp_str.str().c_str();
Run Code Online (Sandbox Code Playgroud)
没有错误但cstr2没有达到预期值.它用一些地址初始化.
怎么了,怎么解决?