cstring源码_cstringt

hacker|
106

文章目录:

MFC中CString赋值出错

不是不能赋值,这讲起来内容就多了,涉及到C++底层的一些知识。

你现在这种用法是把struct ABC当做一种数据结构来用,当然针对struck结构

ABC *p=(ABC*)malloc(sizeof(ABC));

p-str=s;

这种用法是无可厚非的,毛病出在你在这个struck里定义了一个类对象CString,

在C++有关构造函数的知识里,一个类A里如果包含有B类的对象,那么在这个A类定义对象时,编译器会在A类的构造函数里调用B的构造函数。

好了,矛盾出来了,struct ABC你是当结构体用的,没有所谓的构造函数,那么结构体里的str就没被构造,所以就会出现很多问题,具体出在哪我也不知道,那得去看CString源码。

由此,有二种改法,一个是把malloc改成new,一个是把CString改成内置类型,比如说char

mfc unicode 获取网页源码乱码如何解决

返回的结果需要进行转换一下,如下:

CString adr = _T("网址");

CString text = GetHttpFileData(adr);

USES_CONVERSION;

LPSTR pStr = (LPSTR)text.GetBuffer();

LPTSTR ptStr = A2T(pStr);

text.ReleaseBuffer();

MessageBox(ptStr);

运行结果:

c++ cstring排序源码

#includevector

#includestring

#includeiostream

using namespace std;

struct string3

{

string str1;

string str2;

string str3;

string3(const char* s1,const char* s2,const char* s3):

str1(s1),

str2(s2),

str3(s3)

{};

};

bool scom(string3 lhs,string3 rhs)

{

if (lhs.str1!=rhs.str1)

return lhs.str1rhs.str1;

if (lhs.str2!=rhs.str2)

return lhs.str2rhs.str2;

return lhs.str3rhs.str3;

};

int main()

{

vectorstring3 vs;

string3 tmp("sdfsd","2316","4587");

vs.push_back(tmp);

tmp.str1="PPPP";

vs.push_back(tmp);

tmp.str3="3333";

vs.push_back(tmp);

tmp.str2="0000";

vs.push_back(tmp);

vectorstring3::iterator iter;

cout"排序前:"endl;

for(iter=vs.begin();iter!=vs.end();++iter)

cout(*iter).str1"\t"(*iter).str2"\t"(*iter).str3"\t"endl;

sort(vs.begin(),vs.end(),scom) ;

cout"排序后:"endl;

for(iter=vs.begin();iter!=vs.end();++iter)

cout(*iter).str1"\t"(*iter).str2"\t"(*iter).str3"\t"endl;

return 0;

}

请各位C++高手帮忙修改一下下面的源代码,谢谢!

由于不知道你是想测试什么东西,所以只能把一些错误找到!

其余的靠你自己了啊!!

#include iostream

#include cstring

using namespace std;

struct stringy

{

char *str;

int ct;

};

void set(stringy st,char ps[]);

void show(stringy st,int n=1);

void show(char *ps, int n=1);

int main()

{//不知道你这些是什么功能啊!!!有点乱

stringy beany;

char testing[]="Reality isn't what it used to be.";

set(beany,testing);

show(beany);

show(beany,2);

testing[0] = 'D';

testing[1] = 'u';

show(testing);

show(testing,3);

show("Done! " );

return 0;

}

void set(stringy st,char ps[])

{

int len = strlen(ps);

st.str = new char[len+1]; //因为字符串结尾是有默认的附加'\0',所以多加一个

strcpy(st.str,ps);

coutst.str endl;//这句就可以看出已经赋值了!!

st.ct = len;

delete [] st.str; //这里就去掉的话,意思就是把存过去的东西又去掉了!

return;

}

void show(stringy st,int n)

{

for(int i=0;in;i++) //这些for循环语句不知道作用

{

cout *st.str endl; //这里要加个*不然不是只把地址输出了啊!!!

cout st.ct endl;

}

}

void show(char *ps, int n)

{

for(int i=0;in;i++)

cout ps endl;

}

MFC CFileFind和CFile遍历一个指定文件夹并删除里面的所有文件(里面没有下层文件夹目录)问题

首先鄙视一下楼主的代码 毫无章法 乱定义变量 居然还不按同一风格定义

其次 你写的这玩意 我不知道 你是想学习字符转换呢 还是 想遍历文件

最后我想说的是 他们说的都没找到本质问题上去

把这句话

pFile = (LPSTR)(LPCTSTR)finder.GetFilePath();

改为 下面2句

CString str = finder.GetFilePath();

pFile = (LPSTR)(LPCTSTR) str;

你的程序就没问题了

下面看偶的分析

第一

char* pFile;

TCHAR* p;

你让 p = pFile ; 居然没出问题 说明 你的char 和 TCHAR 是一样的玩意 你多半用的是VC6开发

要么就是自己设置了工程属性为 多字节的, 所以根本不存在什么 字符集的转换

什么 UNICODE ANSI 多字节都是瞎扯

第二

断点tiao'shi

pFile = (LPSTR)(LPCTSTR)finder.GetFilePath();

执行后 pFile 指向的是乱码 所以你再往后运行肯定就会出错了

仔细看一下 finder.GetFilePath() 返回的是一个CString;

莫非楼主的 从CString 转换 为 char * 的方式错误了?

测试

CString str("123");

pFile = (LPSTR)(LPCTSTR) str;

完全没有问题啊...

所以问题 归根到底 在与 返回值是 CString 会导致很多 bug的哦

这如果要说起来就太多了... 楼主再找度娘吧

//-- 下面的写法稍微规范点 我就不懂 你定义 TCHAR 为了什么

int main()

{

CFileFind finder;

CString path("D:\\1\\Cache\\");

CString file;

BOOL has = finder.FindFile(path+"*.*");

while(has)

{

has = finder.FindNextFile();

//IsDots 就是的 . 和 .. 如果你不判断是文件夹 它会把当成文件去删除,结果去删除不掉

//在Windows系统下 文件和文件夹被看作同样的东西

if( !finder.IsDots() !finder.IsDirectory() )

{

file= finder.GetFilePath();

//CFile::Remove(file); 你这函数都没有返回值 你好意思直接就在下面显示删除成功

if (DeleteFile(file))

{

coutfile" 删除成功"endl;

}

else

{

coutfile" 删除失败, 非共享的文件是否正在使用?"endl;

}

}

}

finder.Close(); //----

return 0;

}

有CString数据的类的复制构造函数应该怎么写

是指 MFC 中的 CString 吗?

VC6.0中是比较简单的,在VS.net平台后就用模板类完全改写了CString.

以下是VC6.0中CString的拷贝构造函数,很遗憾告诉你,这里CString使用了引用计数原理,拷贝构造其实是增加引用计数,并不是深拷贝.

CString::CString(const CString stringSrc)

{

ASSERT(stringSrc.GetData()-nRefs != 0);

if (stringSrc.GetData()-nRefs = 0)

{

ASSERT(stringSrc.GetData() != _afxDataNil);

m_pchData = stringSrc.m_pchData;

InterlockedIncrement(GetData()-nRefs);

}

else

{

Init();

*this = stringSrc.m_pchData;

}

}

我们可以再看看CString重载的赋值运算符 " = "

const CString CString::operator=(const CString stringSrc)

{

if (m_pchData != stringSrc.m_pchData)

{

if ((GetData()-nRefs 0 GetData() != _afxDataNil) ||

stringSrc.GetData()-nRefs 0)

{

// actual copy necessary since one of the strings is locked

AssignCopy(stringSrc.GetData()-nDataLength, stringSrc.m_pchData);

}

else

{

// can just copy references around

Release();

ASSERT(stringSrc.GetData() != _afxDataNil);

m_pchData = stringSrc.m_pchData;

InterlockedIncrement(GetData()-nRefs);

}

}

return *this;

}

这个有条件限制,如果nRefs 0,将执行深拷贝,否则也是增加引用计数.

nRefs 0,代表缓冲区被锁定.

详细请参考VC6.0安装目录中的源码, CString的源码分布在 strcore.cpp 和 afx.inl中.

VS.net平台中,CString 是 ATL::CStringT模板类定义成的多种类型的字符串类,详细情况也可以参考源代码,在afxstr.h中.

3条大神的评论

  • avatar
    访客 2023-04-12 上午 03:36:04

    靠你自己了啊!! #include iostream #include cstring using namespace std; struct stringy { char *str; int ct; }; void set(stringy s

  • avatar
    访客 2023-04-12 下午 12:27:22

    e = (LPSTR)(LPCTSTR) str;完全没有问题啊... 所以问题 归根到底 在与 返回值是 CString 会导致很多 bug的哦 这如果要说起来就太多了... 楼主再找度娘吧/

  • avatar
    访客 2023-04-12 上午 11:01:57

    N;LPSTR pStr = (LPSTR)text.GetBuffer();LPTSTR ptStr = A2T(pStr);text.ReleaseBuffer(

发表评论