研一寒假03_string定义字符串_指着(2)_指针和字符串(代码)_指针&动态结构

#---------------------------string定义字符串-----------------------------#

#include <iostream>
#include <string>   //for string class available 要使用string去定义变量,必须包含这个头文件
//要使用string类,必须包含string这个头文件.string类位于名称空间std中,因此还必须提供一条using编译指令,或者使用std::string来引  用它
#include <cstring> //c-style string libraint main(){

using namespace std;
string str1; //定义一个空的字符串变量str1
string str2="panther"; //定义一个字符串变量str2,string有自动调整字符数大小的功能,string类隐藏了字符串数组的性质

string str3=str2; //将str2复制给str3

char ch1=str2[2]; //将str2的第三个字母赋值给ch1,即可以用数组表示方法来访问存贮在string对象中的字符

/* string可以用于输入和输出 */
cin>>str1; //可以用cin从键盘输入字符串至str1
cout<<str2; //可以用cout来显示string对象

string str4=str2+str3; //将str2和str3加在一起赋值给str4 即str4=pantherpanther  *****

/* c风格和c++风格计算字符个数的方法 */
/* 注意strlen()从数组的第一个元素开始计算字节数,直到遇到空字符 */
int len1=str2.size();    //计算str2字符的个数,并赋值给len1;str2是一个string对象,而size()是string对象的一个方法,故可以用这种表示方法  

char ch2[20]="jaguar"; //创建一个字符串数组
int len2=strlen(ch2);  //strlen()用于c风格去计算数组中字符的个数

/* c++风格输入行的方法(即每次不是只输入一个单词) */ 
char ch3[20]; //创建一个空字符串数组ch3
string str5; //创建一个空的字符串变量str5 

cin.getline(ch3,20); //c-style 输入行的方法
getline(cin,str5); //c++风格输入行的方法,getline()不是类方法,它将cin作为参数指出到哪里去寻找输入
/*为何char类型的可以用cin.getlline()而string类型的缺不可以?这是由于在引入sring类之前,c++有了istream类,因此istream的设计考虑了诸如
int char doule等基本的数据类型,但是没有考虑string类,所以istream中有处理int double等的基本类方法,但是没有string对象的类方法*/

return 0;
}

#include <iostream>
#include <string>

int main()
{
std::string name; //将name的类型声明为std::string
string str1="haijing";
}

#--------------------------指针(2)---------------------------#

#include <iostream>
#include <cstring> //for strlen(),strcpy()

int main()
{
using namespace std;


/* 指针加1的问题 */

int p1=3;
double* pw; //声明一个指针

p1=p1+1; //p1=4
pw = pw+1; //如果系统对double型变量使用8个字节存储,则pw在原来的基础上加8(地址加8,实际pw指向下一个元素)


/* 数组和指针的关系 */

double wages[3] = {1000.0,2000.0,3000.0}; //声明并初始化一个数组
short stacks[3] = {3,2,1}; //声明并初始化一个数组 short占两个字节
double* pd=wages; //或者double* pd=&wages[0];是等价的,都是讲数组wages第一个元素的地址赋给pd

cout<<stacks[1]<<endl; //打印stacks数组的第二个元素2
cout<<*(stacks+1)<<endl; //打印stacks数组的第二个元素2 即stacks[1]和*(stacks+1)是等价的
//在程序中写stacks[1]的时候,c++编译器会将stacks[1]表达式看作是*(stacks+1)。同样stacks[1]和*(stacks+2)是等价的

cout<<sizeof(wages)<<endl; //打印24 在使用sizeof的时候,c++编译器不会将wages解释为数组第一个元素的地址,在这里有三个元素,一个元素占8个字节,所以一共是24字节
cout<<sizeof(pd)<<endl; //打印4

cout<<&wages[0]<<endl; //或者是 cout<<wages<<endl; 都将打印数组元素的第一个地址
cout<<&wages<<endl; //打印整个数组的地址

/* 指针和字符串(引入) */

char flower[10] = "rose";
cout<<flower<<"s are beautiful\n"; //打印roses are beautiful\n
//注意在cout和多数c++中,char数组名、char指针以及用引号括起来的字符串常量都被解释为字符串第一个字符的地址*****
//如果给cout一个 字符 的地址,那么cout将从改字符开始打印,直到遇到空字符\0
//但是上述代码并不会吧真个字符串的地址发给cout,而只是发送第一个字符的地址给cout,这意味着对于数组中的字符串、用引号括起来的
//字符常量以及指针所描述的字符串。处理的方式都是一样的,都将传送第一个字符的地址

/* 指针和字符串(代码) */

 1 char animal[20]="bear"; //声明并初始化一个数组
 2 const char* bird = "wren"; //声明并初始化一个字符串常量指针,因为有const所以不可以更改bird所指向的值,即不能对bird使用cin输入
 3 //该语句将w的地址赋给bird
 4 char* ps; //声明一个指针,没有初始化 
 5 
 6 cout<<animal<<" and "; //打印bear and
 7 cout<<bird<<"\n"; //打印wren,最后的\n表示换行
 8 //cout<<ps<<"\n"; //错误,因为并没有对ps初始化
 9 
10 cout<<"Enter a kind of animal: ";
11 cin>>animal; //输入至animal数组中,而不能输入到bird中,因为在定义bird时使用了const,所以只能读bird而不能修改
12 //也不能输入至ps,因为ps没有被初始化,输入到哪里都不知道
13 //此句会覆盖animal中原有的内容?书中给出的答案是会覆盖掉 如果输入的是fox
14 ps = animal; //设置ps指向一个字符串 将animal数组中第一个元素的地址赋给ps
15 cout<<animal<<" at "<<(int *) animal<<endl; //打印fox at 0x0065fd30 animal原来的类型是char*,这里做强制转换int*
16 cout<<ps<<" at "<<(int *) ps<<endl; //打印fox at 0x0065fd30 ps原来的类型是char*
17 //一般来说,如果给cout提供一个指针,cout将会打印一个地址,但如果指针的类型为char*,那么cout将显示指向的字符
18 //如果要显示字符串的地址,则将该指针强制转换为另一种类型,如int*,因此ps显示的是fox,而(int*)ps显示的是地址 
19 
20 char* pf;
21 pf=new char [strlen(animal)+1]; //使用new给pd分配一个长度为animal的长度+1的内存地址
22 strcpy(pf,animal); //将animal复制给pf, 经常需要将字符串放到数组中,在数组初始化时可以使用等号(=),在不是初始化的时候,就只能使用strcpy()或者是strncpy()了
23 //所以对字符串进行操作时,最好使用string去定义变量,之后就可以使用+来进行字符串的合并了*****
24 cout<<"After using strcpy():\n";
25 cout<<animal<<" at "<<(int*)animal; //显示fox at 0x0065fd30
26 cout<<pf<<" at "<<(int*)pf<<endl; //显示fox at 0x004301c8
27 
28 return 0;
29 }
指针&字符串

#-----------------------------------------指针&动态结构--------------------------------------#

#include <iostream>

/* 新建一个结构 */
struct inflatable
{
char name[20];
float volume;
double price;
};

/* 主函数 */
int main()
{
using namespace std;

inflatable* ps = new inflatable; //把可以存储inflatable结构的一块可用内存的地址赋给ps
//创建动态结构,在程序运行时候创建结构
//由于没有结构变量,c++提供了->来访问结构成员 方法一是:ps->price=3.99对结构的price成员进行赋值
//方法二:如果ps是指向结构的指针,则*ps就是被指向的值--结构本身,由于*ps是一个结构,因此(*ps).price是该结构的price成员

cout<<"Enter name of inflatable item: ";
cin.get(ps->name,20); //使用get方法输入行,可以输入20个字符给结构中的name成员,第一种给结构成员赋值方法

cout<<"Enter volume in cubic feet: ";
cin>>(*ps).volume; //第二种给结构成员赋值方法

cout<<"Enter price: $";
cin>>ps->price; //第一种给结构成员赋值方法

cout<<"Name: "<<(*ps).name<<endl;
cout<<"Volume: "<<ps->volume<<endl;
cout<<"Price: "<<ps->price<<endl;

delete ps; //释放空间

return 0;
}

#-------------------------------------------指针函数&多次输入到一个指针数组中------------------------------#

#include <iostream>
#include <cstring> //#include <string>也可以

using namespace std;

char* getname(); //声明一个指针函数,因为是要返回一个地址,所以要声明指针函数

int main()
{
char* name;

name = getname(); //将指针函数返回的地址赋给name
cout<<name<<" at "<<(int*)name<<endl; //显示获取的name并显示存储的地址 在cout中的name只有char型指针才会打印字符串,其余类型的指针都会显示地址
delete [] name; //释放内存

name = getname(); //再次调用指针函数 注意在指针函数中出现了new,下面会有delete,所以new和delete还是成对出现的
cout<<name<<" at "<<(int*)name<<endl;
delete [] name;

cout<<name[0]<<"自己加的,确认一下name中是否存储了上次从键盘输入的名字"<<endl; //应该是不行的,因为name就是一个指针变量,不是数组啊

return 0;
}

char* getname()
{
char temp[80]; //新建一个可以存储80个字符的char型数组
cout<<"Enter last name: ";
cin>>temp; //将从键盘输入的名字临时存储于temp中

char* pn = new char [strlen(temp)+1]; //使用new关键字开创一个足以存储strlen(temp)+1个字符的内存,并将地址赋给pn,加1是为了给最后的空字符\0留一个位置
strcpy(pn,temp); //将temp复制给pn

return pn; //返回存储输入名字的地址
}

 

最后编辑于 2019.02.18 22:46 家

 

posted @ 2019-03-01 20:15  兵临城下的匹夫  阅读(206)  评论(0编辑  收藏  举报
TOP