c和c++中的复合类型

c和c++中的复合类型

标签(空格分隔): c++


复合类型

复合类型
数组
结构
共用体
枚举
指针
字符串

数组

数组
静态数组
动态数组
数组概念

数组是一种数据格式,可以存储多个同类型的值。例如int数组,float数组,或者是结构数组。

数组三要素

1.类型, 2.数组名, 3.元素个数

初始化特点
  • 只有在数组定义的时候才能进行初始化。
  • 初始化之后,只能使用下标来访问和修改数组元素
  • 当只对部分元素初始化之后,其余被初始化为零
#include<iostream>

int main(void)
{
    int data[10] = {1, 2};

    for(int i=0; i<10; i++)
    {
        std::cout << data[i] << std::endl;
    }

    return 0;
}

无标题.png-1.9kB

c++使用的大括号的初始化方法优点
  • 可以省略等号
  • 当需要初始化为零的时候,直接使用大括号,不需要赋值
  • 最终要的一点,防止出现缩窄,可以避免很多错误
#include<iostream>

int main(void)
{
    using namespace std;

    int data1[10] {};
    
    for(int i=0; i<10; i++)
    {
        cout << data1[i] << endl;
    }
    //由于出现了缩窄,所以编译不会通过
    //int data[10] {2.12, 3.5};

    return 0;
}

无标题.png-2.8kB

字符串

    a(字符串) --> b(c风格字符串)
    a --> c(string)
字符串的存储方式

字符串是存储在内存中的连续字节中的一系列字符。由于一个char类型占的空间是一个字节,所以一个char可以代表一个字符。
o

C字符串风格特点
  • 以字符NULL截尾,代表的ASCII码为’\0’,值为0。
字符数组不等于字符串

字符串属于字符数组,但是字符数组并不等于字符串,只有字符数组以’\0’结尾的时候,才是字符串。

字符串的初始化
  • 大括号初始化方法
  • 赋值为字符常量
c和c++从输入读取字符串的方式
  • c从输入读取字符串
    • scanf方式输入–>将空白字符当作字符结束符
    • 使用gets()方式输入 -->将换行符当作字符串结束字符
  • c++特有的从输入读取字符串的方法
    • cin>>str 效果类似与使用scanf的结果
    • cin.getline(str, length)类似与gets()效果
    • cin.get(str, length)类型与getline,只是将换行符放回到输入队列。

c代码验证

#include<stdio.h>

int main(void)
{
    char str[20];
    char ch;

    printf("Please input a str: ");
    scanf("%s", str);

    for(int i=0; i<6; i++)
    {
        ch = getchar();
        putchar(ch);
    }


    printf("You entered: %s", str);

    return 0;
}

无标题.png-1.9kB
该示例程序分析了scanf在接受到一个字符串"haojie chen\n"之后的行为,从结果中我们可以知道,当scanf读取到空格的时候(空格输入空白字符)的时候,就认为已经达到了字符串的结尾,所以将空格和以后输入的字符串重新放回到输入队列,从我们使用的getchar()得到的结果中可以看出。

#include<stdio.h>

int main(void)
{
    char str[20];
    char ch;

    printf("Please input a string: ");
    gets(str);
    //ch = getchar();
    printf("You entered: %s", str);

    return 0;
}

无标题.png-1.9kB

从结果中可以看出,当使用gets()的时候,只会把换行符当作字符串的结尾符,并且将换行符变换成’\0’,而不是放回到输入队列,可以将上述代码中的注释取消掉进行检验。

c++代码验证

#include<iostream>
#include<cstring>

int main(void)
{
    using namespace std;

    const int Arsize = 20;
    char name[Arsize];

    cout << "Enter your name:\n";
    cin.getline(name, Arsize);
    //cin.get();

    cout << "Name: " << name << ".\n";

    return 0;
}

无标题.png-1.7kB

分析类似于c中的结果,可以解除注释,进行验证。

#include<iostream>
#include<cstring>

int main(void)
{
    using namespace std;

    const int Arsize = 20;
    char name[Arsize];
    char dessert[Arsize];

    cout << "Enter your name:\n";
    cin.get(name, Arsize);

    //如果不使用这个语句,则当我们输入一个字符串和换行符之后,
    //换行符会停留在队列中,我们将无法继续输入
    cin.get();

    cout << "Enter your favorite dessert:\n";
    cin.get(dessert, Arsize);

    cout << "I have some delicious " << dessert;
    cout << " for you, " << name << ".\n";

    return 0;
}

无标题.png-3.3kB

这里必须要使用cin.get()来将输入队列中的换行符进行取出,否则换行符则将会永远停留在输入队列中,因为当get()读到换行符的时候,会将换行符放回到输入队列中。

string类字符串
  • 特点
    1. 可以使用c风格的字符串进行初始化
    2. 可以使用cin来用键盘输入的字符串来初始化
    3. 可以向c风格字符串一样使用下标来访问单个字符
  • 和c风格字符串的不同之处
    1. 赋值方面
    2. string类字符串可以自动调节大小
  • 简化了字符串的操作
    1. 复制操作 strcpy VS =
    2. 拼接操作 strcat VS +
      代码显示了使用c方式的方法和c++方式区别
#include<iostream>
#include<string>
#include<cstring>

int main(void)
{
    using namespace std;

    const int SIZE = 20;
    string str1 = "haojie";
    string str2 ;
    char char1[SIZE] = "haojie";
    char char2[SIZE];

    //赋值操作
    str2 = str1;
    //char2 = char1; //不允许
    //strcpy(char2, char1);
    strncpy(char2, char1, SIZE);

    cout << "assign: \n";
    cout << "\t" << str2 << endl;
    cout << "\t" << char2 << endl;

    //合并操作
    str2 = str1 + "chen";
    //strcat(char2, "chen");
    strncat(char2, "chen", SIZE-1);

    cout << "connection: \n";
    cout << "\t" << str2 << endl;
    cout << "\t" << char2 << endl;

    //获得字符串长度
    cout << "Length: \n";
    cout << "\t" << str2.size() << endl;
    cout << "\t" << strlen(char2) << endl;

    return 0;
}

代码执行的结果是一样的,但是可以看到使用string可以大大简化我们操作字符串的步骤。

string类面向行的输入方式

当使用cin来对string对象进行赋值的时候,只能获得一个单词,如果要想获得关于一行的数据,就需要使用面向行的输入方式
getlin(cin, str)

#include<iostream>
#include<string>

int main(void)
{
    using namespace std;
    char char1[20];
    char char2[20] = "jaguar";
    string str1;
    string str2 = "panther";

    cout << "Enter a kind of feline: ";
    cin >> char1;
    cin.get();

    cout << "Enter another kind of feline: ";
    cin >> str1;
    cin.get();

    cout << "Here are some felines:\n";
    cout << char1 << " " << char2 << " " 
        << str1 << " " << str2 << endl;

    cout << "The third letter in " << char2 << " is " << char2[2] << endl;
    cout << "The third letter in " << char1 << " is " << str1[2] << endl;

    cout << "Enter another string: " ;
    getline(cin, str1);

    cout << "The string is: " << str1;

    return 0;
}

无标题.png-8kB

当数字和字符串混合输入应注意事件

但我们使用cin获得一个数字的时候,此时cin会将输入的回车符放回到输入序列中,所以如果我们接着需要输入一个字符串的时候,系统会直接在输入序列中取值,取到换行符,所有不会让我们输入,会认为输入已经结束。c中不存在这个问题

#include<stdio.h>

int main(void)
{
    int i;
    char data[20];

    printf("Please enter a number: ");
    scanf("%d", &i);

    printf("Please enter a string: ");
    scanf("%s", data);
    printf("You entered number: %d", i);
    printf("You entered string : %s", data);

    return 0;
}

无标题.png-3.4kB

#include<iostream>

int main(void)
{
    using namespace std;

    cout << "What year was your hourse build?\n";
    int year;
    cin >> year;

    //cin.get();

    cout << "What is its street address?\n";
    char address[80];

    cin.getline(address, 80);

    cout << "Year built: " << year << endl;
    cout << "Address: " << address << endl;
    cout << "Done!\n";

    return 0;
}

无标题.png-5.3kB
可以看到和预期的一样,那么为什么我们可以输入多个数字呢?因为输入数字的时候,会忽略空白符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

able陈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值