std::wstring 判断字符串是否包含某值
时间: 2023-06-20 09:04:16 浏览: 577
可以使用 `std::wstring` 类型自带的 `find` 方法来判断字符串是否包含某个子串。
示例代码:
```cpp
#include <iostream>
#include <string>
int main() {
std::wstring str = L"Hello, world!";
std::wstring subStr = L"world";
if (str.find(subStr) != std::wstring::npos) {
std::wcout << L"The string contains the substring." << std::endl;
} else {
std::wcout << L"The string does not contain the substring." << std::endl;
}
return 0;
}
```
上述代码中,`find` 方法返回子串在主串中第一次出现的位置,如果找不到则返回 `std::wstring::npos`,这里用它来判断是否包含子串。
相关问题
C++低版本 判断字符串是否含有特殊字符或中文
在C++早期版本(如C++98或更早),判断字符串是否包含特殊字符或中文并不像现代C++那样直观,因为标准库提供的`std::string`类没有内置的方法直接检查这个。你需要编写自定义函数或者遍历字符串的每个字符来进行检查。
下面是一个简单的示例,使用ASCII码范围来判断字符是否为字母、数字或常用特殊字符:
```cpp
#include <cctype> // 包含用于ASCII值检查的头文件
bool containsSpecialCharsOrChinese(const std::string& str) {
for (char c : str) {
if (!isalnum(c) && !ispunct(c)) { // isalnum检查字母和数字,ispunct检查标点符号
return true; // 找到非字母、数字和标点的字符,则返回true
}
}
return false; // 遍历完所有字符都没有找到,返回false
}
```
对于检测中文字符,由于不是ASCII字符,你可以使用`wchar_t`类型和`wctype_t`函数,但这通常需要链接一个多字节字符集支持,比如宽字符库`cwctype`:
```cpp
#include <cwctype>
#include <locale>
bool containsChinese(const std::wstring& str) {
std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
auto utf8_str = conv.to_bytes(str);
for (char16_t c : str) {
if (!std::iswalnum(c)) { // 检查是否为字母、数字或中文字符
return true;
}
}
return false;
}
```
记得替换`std::wstring`为`std::string`并修改相应的转换函数,如果处理的是UTF-8编码的字符串。
objectarx二次开发自定义实体,实体数据是一个结构体tag,结构体tag中包含另外一个结构体map、一个类指针Class*、一个bool,而结构体map保存的是一个long long int数据和一个vector<wstring>.类指针class中有一个vector<class2*>, class2是个基类,使用时会根据class中的int型的参数判断强制转换成不同子类进行绘制,子类中的数据也不相同,class2中包含了vector<AcGePoint3D>以及字符串、int等数据,请问如何保存读取这些数据到dwg
为了保存自定义实体及其数据到DWG文件中,您需要使用AutoCAD提供的ObjectARX API进行开发。下面是大致的步骤:
1. 定义自定义实体类,其中包含tag结构体、Class类指针、bool变量等成员变量。
```cpp
class MyEntity : public AcDbEntity
{
public:
ACDB_DECLARE_MEMBERS(MyEntity);
MyEntity();
virtual ~MyEntity();
// Overridden methods from AcDbEntity
virtual Adesk::Boolean subWorldDraw(AcGiWorldDraw* pWd);
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* pFiler) const;
virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* pFiler);
private:
tag m_tag;
Class* m_pClass;
bool m_bFlag;
};
```
2. 在实体类中实现`dwgOutFields`和`dwgInFields`方法,用于保存和读取实体数据到DWG文件中。
```cpp
Acad::ErrorStatus MyEntity::dwgOutFields(AcDbDwgFiler* pFiler) const
{
Acad::ErrorStatus es = AcDbEntity::dwgOutFields(pFiler);
if (es != Acad::eOk) return es;
// Write tag data
pFiler->writeInt32(m_tag.map.size());
for (auto it = m_tag.map.begin(); it != m_tag.map.end(); ++it)
{
pFiler->writeInt64(it->first);
pFiler->writeInt32(it->second.size());
for (const auto& str : it->second)
{
pFiler->writeBChunk(str.c_str(), str.size() * sizeof(wchar_t));
}
}
pFiler->writeInt64(reinterpret_cast<AcDbUIntPtr>(m_tag.ClassPtr));
pFiler->writeBool(m_tag.bFlag);
// Write Class data
pFiler->writeInt32(m_pClass->vec2.size());
for (const auto& pClass2 : m_pClass->vec2)
{
pFiler->writeInt32(pClass2->getType()); // Save type information
pFiler->writeBChunk(&pClass2->ptVec[0], pClass2->ptVec.size() * sizeof(AcGePoint3d));
pFiler->writeBChunk(pClass2->str.c_str(), pClass2->str.size() * sizeof(wchar_t));
pFiler->writeInt32(pClass2->n);
}
return pFiler->filerStatus();
}
Acad::ErrorStatus MyEntity::dwgInFields(AcDbDwgFiler* pFiler)
{
Acad::ErrorStatus es = AcDbEntity::dwgInFields(pFiler);
if (es != Acad::eOk) return es;
// Read tag data
int nSize = 0;
pFiler->readInt32(&nSize);
for (int i = 0; i < nSize; ++i)
{
long long llKey = 0;
pFiler->readInt64(&llKey);
int nVecSize = 0;
pFiler->readInt32(&nVecSize);
std::vector<std::wstring> vecStr;
for (int j = 0; j < nVecSize; ++j)
{
char* pBuf = nullptr;
int nLen = 0;
pFiler->readBChunk(&pBuf, &nLen);
vecStr.emplace_back(reinterpret_cast<wchar_t*>(pBuf), nLen / sizeof(wchar_t));
acutDelString(pBuf);
}
m_tag.map[llKey] = vecStr;
}
AcDbUIntPtr nPtr = 0;
pFiler->readInt64(reinterpret_cast<AcDbUIntPtr*>(&nPtr));
m_tag.ClassPtr = reinterpret_cast<Class*>(nPtr);
pFiler->readBool(&m_tag.bFlag);
// Read Class data
pFiler->readInt32(&nSize);
for (int i = 0; i < nSize; ++i)
{
int nType = 0;
pFiler->readInt32(&nType);
class2* pClass2 = nullptr;
if (nType == 1)
{
pClass2 = new class2A;
}
else if (nType == 2)
{
pClass2 = new class2B;
}
else
{
// Unknown type, skip
continue;
}
char* pBuf = nullptr;
int nLen = 0;
pFiler->readBChunk(&pClass2->ptVec[0], pClass2->ptVec.size() * sizeof(AcGePoint3d));
pFiler->readBChunk(&pBuf, &nLen);
pClass2->str = std::wstring(reinterpret_cast<wchar_t*>(pBuf), nLen / sizeof(wchar_t));
acutDelString(pBuf);
pFiler->readInt32(&pClass2->n);
m_pClass->vec2.emplace_back(pClass2);
}
return pFiler->filerStatus();
}
```
3. 在自定义实体的构造函数中初始化成员变量。
```cpp
MyEntity::MyEntity()
{
m_tag.ClassPtr = nullptr;
m_tag.bFlag = false;
m_pClass = new Class;
}
```
4. 在实体类中实现`subWorldDraw`方法,用于绘制实体。
```cpp
Adesk::Boolean MyEntity::subWorldDraw(AcGiWorldDraw* pWd)
{
// Draw entity using OpenGL
// ...
// Draw Class data
for (const auto& pClass2 : m_pClass->vec2)
{
if (auto pClass2A = dynamic_cast<class2A*>(pClass2))
{
// Draw class2A using OpenGL
// ...
}
else if (auto pClass2B = dynamic_cast<class2B*>(pClass2))
{
// Draw class2B using OpenGL
// ...
}
else
{
// Unknown type, skip
continue;
}
}
return Adesk::kTrue;
}
```
在AutoCAD中使用自定义实体时,可以使用下列代码进行创建并添加到当前图形数据库中:
```cpp
MyEntity* pEnt = new MyEntity;
AcDbObjectId objId;
Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase()->addAcDbEntity(objId, pEnt);
if (es == Acad::eOk)
{
// Set entity properties
// ...
// Add entity to current space
AcDbBlockTableRecord* pBTR = nullptr;
es = acdbHostApplicationServices()->workingDatabase()->getModelSpace(pBTR, AcDb::kForWrite);
if (es == Acad::eOk)
{
es = pBTR->appendAcDbEntity(objId, pEnt);
pBTR->close();
}
}
else
{
delete pEnt;
}
```
当从DWG文件中读取自定义实体时,可以使用下列代码进行获取:
```cpp
AcDbObjectIdArray objIds;
acdbGetObjectsOfType(objIds, MyEntity::desc());
for (const auto& objId : objIds)
{
MyEntity* pEnt = nullptr;
Acad::ErrorStatus es = acdbOpenAcDbEntity(reinterpret_cast<AcDbEntity*&>(pEnt), objId, AcDb::kForRead);
if (es == Acad::eOk)
{
// Get entity properties
// ...
pEnt->close();
}
}
```
阅读全文