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;
}
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;
}
字符串
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;
}
该示例程序分析了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;
}
从结果中可以看出,当使用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;
}
分析类似于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;
}
这里必须要使用cin.get()来将输入队列中的换行符进行取出,否则换行符则将会永远停留在输入队列中,因为当get()读到换行符的时候,会将换行符放回到输入队列中。
string类字符串
- 特点
- 可以使用c风格的字符串进行初始化
- 可以使用cin来用键盘输入的字符串来初始化
- 可以向c风格字符串一样使用下标来访问单个字符
- 和c风格字符串的不同之处
- 赋值方面
- string类字符串可以自动调节大小
- 简化了字符串的操作
- 复制操作 strcpy VS =
- 拼接操作 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;
}
当数字和字符串混合输入应注意事件
但我们使用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;
}
#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;
}
可以看到和预期的一样,那么为什么我们可以输入多个数字呢?因为输入数字的时候,会忽略空白符。