注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

告别迷茫

梦想与现实的差距,就是我们生活的意义。因为我们有差距,我们才会一直积累,在努力。

 
 
 

日志

 
 

16-2const char *c_str();两种访问STLstring 元素的方式 下标和迭代器  

2014-04-13 15:27:34|  分类: STL 基本的用法 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

/*(1):运算符[]
(2):si代器; string::const_iterator jj;*/
#include<string>
#include<iostream>
using namespace std;

int main()
{
string ww("hello world");
cout<<"dispaly the element in the string using array -syntax:"<<endl;
for(size_t i=0;i<ww.length();++i)
/*size_t 类型定义在cstddef头文件中,该文件是C标准库的头文件stddef.h的C++版。
它是一个与机器相关的unsigned类型,其大小足以保证存储内存中对象的大小。
例如:bitset的size操作返回bitset对象中二进制位中的个数,返回值类型是size_t。
例如:在用下标访问元素时,vector使用vector::size_type作为下标类型,
而数组下标的正确类型则是size_t。vector使用的下标实际也是size_t,源码是typedef size_t size_type。*/
{
cout<<"a ["<<i<<"] is"<<ww[i]<<endl;
}
cout<<endl;

//access the contents of a string using iterators
cout<<"dispaly the element in the string using iterators :"<<endl;
int j=0;
string::const_iterator jj;
for(jj=ww.begin();jj!=ww.end();++jj)
{
cout<<"b ["<<i++<<"] is"<<*jj<<endl;
}
cout<<endl;

//access the contents of a string as a C stytle string
cout<<"the string :";
cout<<ww.c_str()<<endl;//c 的风格 sstring的成员函数;
return 0;

}
/*2014.3.1.11:49
一个基本的无符号整数的C / C + +类型, 它是sizeof操作符返回的结果类型, 该类型的大小是选择。
因此,它可以存储在理论上是可能的任何类型的数组的最大大小。
换句话说,一个指针可以被安全地放进为size_t类型(一个例外是类的函数指针,但是这是一个特殊的情况下)。 size_t类型通常用于循环、数组索引、大小的存储和地址运算。 虽然size_t可以存储一个指针,它的目的是更好地使用另一个unsinged整数类型uintptr_t形式。 在某些情况下,使用size_t类型是更为有效,比习惯性使用无符号类型的程序会更安全。
size_t是在基于无符号整数memsize类型的C / C + +的标准库中定义的。
C语言中,此类型位于头文件stddef.h中,而在C++中,则位于cstddef中。
size_t在C语言中就有了。
它是一种“整型”类型,里面保存的是一个整数,就像int, long那样。这种整数用来记录一个大小(size)。size_t的全称应该是size type,就是说“一种用来记录大小的数据类型”。
通常我们用sizeof(XXX)操作,这个操作所得到的结果就是size_t类型。
因为size_t类型的数据其实是保存了一个整数,所以它也可以做加减乘除,也可以转化为int并赋值给int类型的变量。
类似的还有wchar_t, ptrdiff_t。
wchar_t就是wide char type,“一种用来记录一个宽字符的数据类型”。
ptrdiff_t就是pointer difference type,“一种用来记录两个指针之间的距离的数据类型”。
通常,size_t和ptrdiff_t都是用typedef来实现的。你可能在某个头文件里面找到类似的语句:
typedef unsigned int size_t;
typedef int ptrdiff_t;
而wchar_t则稍有不同。在一些旧的编译器中,wchar_t也可能是用typedef来实现,但是新的标准中wchar_t已经是C/C++语言的关键字,wchar_t类型的地位已经和char, int的地位等同了。
在标准C/C++的语法中,只有int float char bool等基本的数据类型,至于size_t,或size_type都是以后的编程人员为了方便记忆所定义的一些便于理解的由基本数据类型的变体类型。
例如:typedef int size_t;定义了size_t为整型。

dispaly the element in the string using array -syntax:
a [0] ish
a [1] ise
a [2] isl
a [3] isl
a [4] iso
a [5] is
a [6] isw
a [7] iso
a [8] isr
a [9] isl
a [10] isd

dispaly the element in the string using iterators :
b [11] ish
b [12] ise
b [13] isl
b [14] isl
b [15] iso
b [16] is
b [17] isw
b [18] iso
b [19] isr
b [20] isl
b [21] isd

the string :hello world
Pr

//access the contents of a string as a C stytle string
cout<<"the string :";
cout<<ww.c_str()<<endl;//c 的风格 sstring的成员函数;
return 0;



const char *c_str(); c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。 注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针 比如:最好不要这样: char* c; string s="1234"; c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理 应该这样用: char c[20]; string s="1234"; strcpy(c,s.c_str()); 这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作 再举个例子 c_str() 以 char* 形式传回 string 内含字符串 如果一个函数要求char*参数,可以使用c_str()方法: string s = "Hello World!"; printf("%s", s.c_str()); //输出 "Hello World!"
1.string类成员函数c_str()的原型:

                  const char *c_str()const;//返回一个以null终止的c字符串

2.c_str()函数返回一个指向正规c字符串的指针,内容和string类的本身对象是一样的,通过string类的c_str()函数能够把string对象转换成c中的字符串的样式;

3.操作c_str()函数的返回值时,只能使用c字符串的操作函数,如:strcpy()等函数.因为,string对象可能在使用后被析构函数释放掉,那么你所指向的内容就具有不确定性.

eg:

char  name[20];

string  ptr = "tongnono";

strcpy(name,ptr.c_str());//c_str()返回的是一个临时的指针变量,不能对其操作.
本文转自http://blog.csdn.net/swliao/archive/2009/10/22/4712100.aspx
string.c_str是Borland封装的String类中的一个函数,它返回当前字符串的首字符地址。
c_str函数的返回值是const char*的,不能直接赋值给char*,所以就需要我们进行相应的操作转化,下面就是这一转化过程。
c++语言提供了两种字符串实现,其中较原始的一种只是字符串的c语言实现。与C语言的其他部分一样,它在c++的所有实现中可用,我们将这种实现提供的字符串对象,归为c-串,每个c-串char*类型的。
标准头文件<cstring>包含操作c-串的函数库。这些库函数表达了我们希望使用的几乎每种字符串操作。 当调用库函数,客户程序提供的是string类型参数,而库函数内部实现用的是c-串,因此需要将string对象,转化为char*对象,而c_str()提供了这样一种方法,它返回const char*类型(可读不可改)的指向字符数组指针。 例:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
string add_to = "hello!";
const string add_on = "baby";
const char *cfirst = add_to.c_str();
const char *csecond = add_on.c_str();
char *copy = new char[strlen(cfirst) + strlen(csecond) + 1];
strcpy(copy, cfirst);
strcat(copy, csecond);
add_to = copy;
cout << "copy: " << copy << endl;
delete [] copy;
cout << "add_to: " << add_to << endl;
//我强烈建议,以及我的老师也强烈建议我
//一定要用return 0; 来告诉系统:程序正常结束.
//return -1;是用来告诉系统:程序异常结束
//亲们,做开发要认真~共勉~
//一定要用 int main()
return 0;
}
//以上程序过编译
//VC 6.0, win7, - -!兼容性差

result

——————
简单的例子:
函数声明:const char *c_str();
c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同.
这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针
比如:最好不要这样:
char* c;
string s="1234";
c = s.c_str();
//c最后指向的内容是垃圾,因为s对象被析构,其内容被处理(纠正:s对象的析构是在对指针c完成赋值操作之后进行的,故此处并没有错误)
在vc++2010中提示的错误原因:

vc++2010中提示的错误原因

应该这样用:
char c[20];
string s="1234";
strcpy(c,s.c_str());
这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作
c_str()返回的是一个分配给const char*的地址,其内容已设定为不可变更,如果再把此地址赋给一个可以变更内容的char*变量,就会产生冲突,在2010中是不被允许的。但是如果放入函数调用,或者直接输出,因为这些函数和输出都是把字符串指针作为 const char*引用的,所以不会有问题。
———再举个例子———
c_str() 以const char* 类型返回 string 内含的字符串
如果一个函数要求char*参数,可以使用c_str()方法:
string s = "Hello World!";
printf("%s", s.c_str()); //输出 "Hello World!"
——————
c_str在打开文件时的用处:
当需要打开一个由用户自己输入文件名的文件时,可以这样写:ifstream in(st.c_str());。其中st是string类型,存放的即为用户输入的文件名。
  评论这张
 
阅读(0)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017