复合类型(strcpy)

本文详细介绍了C++中的数组、string类和指针的使用,包括数组的创建、初始化、字符串处理、结构体、共用体和枚举的使用,以及指针的声明、赋值和指针算术。文章强调了数组名是其首元素的地址,指针未初始化的危险性,以及指针和字符串之间的关系。还探讨了数组的替代品,如vector和C++11中的array模板类。
摘要由CSDN通过智能技术生成

一、创建和使用数组

数组是一种数据格式,能够存储多个相同类型的值。

数组声明应该注意三点:

  1. 存储在每个元素中的值类型;
  2. 数组名;
  3. 数组的元素数;

格式:

typeName arrayName[arraysSize];
//typeName类型
//arraysSize:指定元素数目,必须是整型常量或const值,也可以为表达式:sizeof(int)。
//arrayName指数组名

例:创建名为months的数组,数组有12元素,每个元素可以存储int类型的值:

 int months[12];

1.复合类型数组

数组之所以被称为复合类型,是因为它是使用其他类型创建的。不能仅仅将某种东西声明数组,它必须是指定类型的,没有通用的数组类型,但存在很多特定的数组类型。
如:

float months[20];
  1. months的类型不是“数组”,而是float 数组,强调了months数组是使用flaot类型创建的。

  2. C++数组是从0开始编号的(没有商量的)必须从0开始。经常使用带索引的方括号表示指定数组元素,如months[0]是months数组第一个元素。

下面程序说明数组一些属性,包括声明数组,赋值,初始化;

#include <iostream>
using namespace std;
int main()
{
   
    int yams[3];
    yams[0]=7;
    yams[1]=8;
    yams[2]=6;

    int yamcosts[3]={
   20,30,5};
    cout<<"Total yams=";
    cout<<yams[0]+yams[1]+yams[2]<<endl;
    cout<<"The package with"<<yams[1]<<"yams const";
    cout<<yamcosts[1]<<"cents per yam.\n";
    int total=yams[0]*yamcosts[0]+yams[1]*yamcosts[1];
    total=total+yams[2]*yamcosts[2];
    cout<<"The total yam expense is"<<total<<"cents.\n";

    cout<<"\nSize of yams array ="<<sizeof yams;
    cout<<"bytes.\n";
    cout<<"Size of one element="<<sizeof yams[0];
    cout<<"bytes.\n";
    return 0;

}

在这里插入图片描述

2.数组初始化

有关初始化数组的规则:

①、只有在定义时才能完成初始化,此后不能使用了,也不能将一个数组赋值给另一个数组:

int a[4]={
   2,4,5,7};//ok
int x[4];//ok
x[4]={
   1,3,7,9};//no
x=a;//no

②、可以使用下标分别给数组的元素赋值。

初始化数组时,提供的值可以少于数组的元素数目。如:

float arr[5]={
   5.0,2.5};

  1. 若只对数组一部分进行初始化,则编译器将其他元素设置为0。

  2. 初始化{1}而不是{0},则第一个元素被设置为1,其中都为0。

//若初始化数组内方括号为空,c++将计算元素个数。
int things[] = {
   1,5,3,6};
//数组包含4个元素。

③.编译器计算元素个数

short things[] = {
   1,5,3,8};
    int num = sizeof things / sizeof(short);

3.c++数组初始化方法

//1.初始化可以省略
double a[4] {
   1.3e4,1.2e3,1.6e4,1.7e4};

//2.不添加如何东西,元素为0。
unsigned int counts[10]={
   };
float array[100]{
   };


//3.列表初始化禁止缩窄转换
long x[]={
   25,92,3.0};//浮点数转换为整型是缩窄操作,即使小数点后面为0。
char y[4] {
   'h','i',1122011,'\0'};//不允许;1122011超过char变量的取值范围
char z[4]{
   'h','i',112,'\0'};//允许,112为int值,但在char取值范围。
4.字符串

c++处理字符串有两种:c_风格字符串,string类方法。

//1. c_风格字符串有一种特殊性质:以空字符结尾,空字符:\0;
char c[8]={
   'f','a','t','e','s','s','a','\0'};

//2.用引号括起的字符即可,这种字符串被称字符串常量或字符串面值,

char arr[11]="Mr.Cheeps";//固定大小,后面补\0

char fish[]="Bubbles";//编译器计数

//注:字符串常量(双引号)不能与字符常量(单引号)互换。

//拼接字符串
cout<<"my give my right  ar"
      "m to a great violinist.\n";

//注:将字符串存储到数组中,最常用的两种方法:
//将数组初始化为字符串常量;
//将键盘或文件输入到数组中;

在这里插入图片描述

二、使用string类

string类扩展了C++库,可以使用string类型的变量而不是字符数组存储字符串。

#include <iostream>
#include<string>
using namespace std;
int main()
{
   
    char charr1[20];
    char charr2[20]="jaguar";
    string str1;
    string str2="panther";

    cout<<"Enter a kind of feline:";
    cin>>charr1;
    cout<<"Enter another kind of feline:";
    cin>>str1;
    cout<<"Here are some feline:\n";
    cout<<charr1<<" "<<charr2<<" "<<str1<<" "<<str2<<endl;
    cout<<"The third letter in"<<charr2<<"is"<<charr2[2]<<endl;
    cout<<"The third leter in"<<str2<<"is"<<str2[2]<<endl;
    return 0;
}

在这里插入图片描述
使用string对象的方式与使用字符数组相同:

  1. 可以用c-风格字符串来初始化string对象;
  2. 可以用cin来将键盘输入存储到string对象中;
  3. 可以使用cout来显示string对象;
  4. 可以使用数组表示法来访问存储在string对象中的字符;

1.c++11字符串初始化

//C++11也允许将列表初始化用于c-风格字符串和string对象:
	char first_date[]={
   "Le Chapon Dodu"};
	string third_data = {
   "The Bread Boel"};


//赋值:不能就一个数组赋值给另一个数组,但可以将string对象赋值给另一个对象:

	char charr1[20];
    char charr2[20]="jaguar";
    string str1;
    string str2="panther";
    charr1=charr2;//不可行
    str1=str2;

//拼接 附加:使用运算符+将string对象合并起来,还可以使用运算符+=将字符串附加到string对象的末尾:
	string str3;
	str3=str1+str2;
	str1+=str2;

2.string类其他操作

//用函数strcpy()将字符串复制到字符数组,用strcat()将字符串附加到字符数组末尾:
//string.h
strcpy(charr1,charr2);//将charr2字符数组复制给charr1;
strcat(charr1,charr2);//将charr2字符数组附加到charr1末尾;
strncpy(charr1,charr2,n);//将charr2前面n个字符复制到charr1在并取代charr1前面两个字符,且复制字符个数n不多与charr1原有的字符(不包括'\0')。
strcmp(charr1,charr2);//字符串比较,直到出现不同字符或遇到'\0'为止。相等返回0;charr1>charr2返回一个整数;charr1<charr2返回一个负数。
strlwr();//将大写转换为小写。
strupr(字符串
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值