2010/11/03

2010/11/3

关键字:C风格字符串

 

C风格字符串(C-style character string)

以空字符null结束的字符数组.

char c1[] = {'C', '+', '+'};    //不是C风格字符串

char c2[] = "C++";              //

 

C风格字符串标准库

必须包含头文件#include<cstring>

cstringstring.hC++版本,string.hC语言提供的标准库.

注意这些标准库函数不会检测起字符串参数.使用这些函数是不安全的,强烈建议不要使用.

使用这些函数有下面限制:

1.      参数不能为空

2.      传入的字符串必须以null结尾

3.      一些函数会修改传入的字符串,必须确保被修改的字符串足够大以容纳本函数新生产的字符串.

 

C风格字符串标准库

strlen(s)

返从s开始直到null的长度,不包括null

strcmp(s1, s2)

比较两个字符串s1s2是否相同,s1s2相等,返回0,s1大于s2,返回正数,s1小于s2,则返回负数.

strcat(s1, s2)

将字符串s2接到s1后面,返回s1.

strcpy(s1, s2)

s2复制给s1,并返回s1

strncat(s1, s2, n)

将字符串s2的前n个字符接到s1后面,返回s1.

strncpy(s1, s2, n)

s2n个字符复制给s1,并返回s1

C风格字符串也可以关系操作符比较,但实际上比较的是地址,比较地址是无意义的:

char c1[] = {'C', '+', '+'};    //不是C风格字符串

    char c2[] = "C++";              //

    char *p1 = &(c1[1]);

    bool b = (c1) > (c2);           //实际比较的是地址

    b = (c1) > (p1);                //实际比较的是地址

也就是说C风格字符串需要比较时必须用strcmp函数.

使用strcatstrcpy等标准库函数时,调用者必须确保目标字符串具有足够的大小.

char cp1[] = {'1', '2', '3'};   //错误,C风格字符串

    char cp2[] = "12345";

    char largeStr[3+1+5];           //错误,目标字符串要多一个结尾用以保存null

    strcpy(largeStr, cp1);          //错误,C风格字符串不能使用strcpy

    strcat(largeStr, " ");          //largeStr可能已经溢出

    strcat(largeStr, cp2);          //largeStr可能已经溢出

修改后

char cp1[] = {'1', '2', '3', 0};

    char cp2[] = "12345";

    char largeStr[3+1+5+1];

    strcpy(largeStr, cp1);

    strcat(largeStr, " ");

    strcat(largeStr, cp2);

不过最好还是使用strn系列函数,明确指定复制、连接的字符个数

char cp1[] = {'1', '2', '3', 0};

    char cp2[] = "12345";

    char largeStr[3+1+5+1];

    strncpy(largeStr, cp1, 4);

    strncat(largeStr, " ", 2);

    strncat(largeStr, cp2, 6);

最简便安全的方法是使用string

    string cp1 = "123";

    string cp2 = "12345";

    string largeStr = cp1;

    largeStr += " ";

    largeStr += cp2;

对于大部分程序,使用string不仅增强安全性,而且效率也有提高,因此尽量避免使用C风格字符串.

 

动态数组

创建和销毁分别用new name[]delete[] name.

动态创建的数据如果需要初始化,只能初始化为元素的默认值,即内置类型只能初始化为0,而类类型只能调用输入参数为void的构造函数或默认构造函数.而不可以使用初始化列表.

class A

{

public:

    A(){a = 1;}

private:

    int a;

};

 

int main()

{

    int *p = new int[10];           //未初始化

    int *p1 = new int[10]();        //初始化为默认值0

    string *pstr = new string[10];  //初始化为空字符串

    A *pa1 = new A[10]();           //调用输入参数为void的构造函数,a1

    A *pa2 = new A[10];             //调用A的输入参数为void的构造函数,a1,A没有默认构造函数

    B *pb1 = new B[10]();           //调用输入参数为void的构造函数,即调用B的默认构造函数,b未初始化

    B *pb2 = new B[10];             //调用B的输入参数为void的构造函数即默认构造函数,b未初始化

 

    return 0;

}

如果类未声明输入参数为void的构造函数,则编译器会自动生成默认构造函数,默认构造函数形如A(){},只分配地址,不初始化变量.

stringC风格字符串

有几点需要注意:

string str = "1243";

    str = str + "1243";             //错误

    str = "1243" + str;             //错误

    str += "1234";                  //正确,这里的+=string类的重载操作符并不等同于str = str + "1234"

 

    char *p = str.c_str();          //错误

    const char *p = str.c_str();    //正确,str.c_str()返回的是string内部数组首地址,不允许被修改

    str += "12";

    const char *p2 = p;             //虽然语法上没问题,但实际可能是错误的,因为p保存的是str之前的内存,str+="12"之后该地址可能无效了,应该将字符串copy到其他内存中

vector和数组

唯一需要知道的是可以用数组初始化vector.

int array[4] = {1,2,3};             //array[3]会被初始化为

    vector<int> vec(array, array+4);    //初始化方法为vector(begin, end),end为哨兵迭代器,vec中会包含从array开始到array+3的所有元素

 

指针与多维数组

C++中的多维数组实际是数组的数组.

理解下面的代码即可:

int array[3][4];

    int (*p1)[4] = array;       //从内向外理解即可.p1是指针,指向int [4]的指针.p1是指向包含个整型元素的数组的指针

    int *p2[4];                 //从内向外理解即可.p2是数组,数组中包含个int *元素.等同于int* p[4];

    p1 = &(array[2]);           //array实际是内层数组的首地址,&array[2]是外层数组的第个元素的首地址

 

可以用typedef简化理解

typedef int intarray4[4];

    for (intarray4 *p=array; p!=array+3; ++p)

    {

        for (int *q=*p; q!=(*p)+4; ++q)

        {

            cout << *q << endl;

        }

    }

intarray4是一种类型,int[4]类型.p就是int[4]数组类型的指针.

p解引用得到int[4]类型的数组中的第一个元素的值,q指针依次遍历指向4个元素.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 根据国际货币基金组织(IMF)的数据,以下是1990年至2019年世界各国GDP的一些关键数据: 1990年: 美国GDP为5.97万亿美元,中国GDP为0.36万亿美元,日本GDP为4.23万亿美元,德国GDP为1.89万亿美元,英国GDP为1.03万亿美元。 1995年: 美国GDP为7.32万亿美元,中国GDP为0.73万亿美元,日本GDP为4.64万亿美元,德国GDP为2.03万亿美元,英国GDP为1.21万亿美元。 2000年: 美国GDP为10.35万亿美元,中国GDP为1.21万亿美元,日本GDP为4.87万亿美元,德国GDP为2.86万亿美元,英国GDP为1.43万亿美元。 2005年: 美国GDP为13.16万亿美元,中国GDP为2.26万亿美元,日本GDP为4.83万亿美元,德国GDP为3.24万亿美元,英国GDP为2.34万亿美元。 2010年: 美国GDP为14.99万亿美元,中国GDP为6.09万亿美元,日本GDP为5.70万亿美元,德国GDP为3.42万亿美元,英国GDP为2.62万亿美元。 2015年: 美国GDP为18.24万亿美元,中国GDP为10.87万亿美元,日本GDP为4.39万亿美元,德国GDP为3.87万亿美元,英国GDP为2.86万亿美元。 2019年: 预估中,美国GDP约为21.30万亿美元,中国GDP约为14.34万亿美元,日本GDP约为5.15万亿美元,德国GDP约为4.2万亿美元,英国GDP约为3万亿美元。 这些数字展示了世界各国经济在这段时间内的增长。可以观察到中国的GDP大幅增长,成为世界第二大经济体。美国依然是全球最大的经济体,但其GDP相对稳定增长。其他国家的GDP增长也呈现不同的趋势和速度,受到各种因素的影响。这些数据只是给出了一个总体的了解,并不能很详细地反映各国的经济情况。 ### 回答2: 1990年世界各国的GDP呈现出较为广泛的差异。当时,美国、中国、日本、德国和法国等国家的GDP排在世界前列。美国的GDP接近6.5万亿美元,中国约为3.3万亿美元,日本大约为2.2万亿美元。相比之下,其他国家的GDP规模较小。 到了1995年,美国的GDP进一步增长至7.6万亿美元,中国的GDP也有了显著的增长,达到5.5万亿美元。德国和日本的GDP略有下降,而英国和法国的GDP逐渐增长。 进入2000年,美国的GDP达到9.8万亿美元,中国迅速崛起成为世界第二大经济体,其GDP约为1.2万亿美元,日本、德国和英国等国家的GDP相对稳定。在此期间,英国也出现较为显著的增长。 2005年,美国的GDP继续增长至11.8万亿美元,中国迅猛发展,GDP达到2.2万亿美元,超过了日本的2.1万亿美元。此外,印度等新兴经济体的GDP也开始显著增长。 到了2010年,美国的GDP继续增长至14.8万亿美元,中国更是迅速发展,GDP达到6万亿美元,成为仅次于美国的世界第二大经济体。此时,巴西和俄罗斯等新兴市场国家的GDP也有了显著增长。 2015年,美国的GDP达到17.9万亿美元,中国继续迅猛发展,GDP超过了10万亿美元。此外,印度和巴西等国家的GDP也取得了显著增长。 截至2019年,美国的GDP达到21.4万亿美元,中国的GDP超过了14.3万亿美元。此外,印度、日本和德国等国家的GDP也有所增长。 总的来说,从1990年到2019年,美国始终是世界上最大的经济体,但中国和其他新兴经济体的GDP也取得了显著增长,世界经济格局发生了重大变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值