练习3.31 编写一段程序,定义一个含有10个int
的数组,令每个元素的值就是其下标值。
#include<cstddef>
#include<iostream>
using namespace std;
int main()
{
constexpr size_t arr_size = 10;
int arr[arr_size] = {};
for (int i = 0; i < arr_size; i++)
{
arr[i] = i;
}
return 0;
}
练习3.32 将上一题刚刚创建的数组拷贝给另一数组。利用vector重写程序,实现类似的功能。
#include<cstddef>
#include<iostream>
using namespace std;
int main()
{
constexpr size_t arr_size = 10;
int arr1[arr_size] = {};
for (int i = 0; i < arr_size; i++)
arr1[i] = i;
int arr2[arr_size];
for (int i = 0; i < arr_size; i++)
arr2[i] = arr1[i];
vector<int> vec1;
for (int i = 0; i < 10; i++)
vec1.push_back(i);
vector<int> vec2 = vec1;
return 0;
}
练习3.33 对于104页的程序来说,如果不初始化scores将会发生什么?
scores中的值全部未定义。
练习3.34 假定p1 和 p2 都指向同一个数组中的元素,则下面程序的功能是什么?什么情况下该程序是非法的?
p1 += p2 - p1;
功能是将p1指向p2,不会非法。 //等价于 p1 = p1 + (p2-p1);
练习3.35 编写一段程序,利用指针将数组中的元素置为0。
#include<iterator>
using namespace std;
int main()
{
int arr[] = {1, 2, 3, 4, 5};
int *beg = begin(arr), *last = end(arr);
while (beg != last)
{
*beg = 0;
++beg;
}
return 0;
}
练习3.36 编写一段程序,比较两个数组是否相等。再写一段程序,比较两个vector对象是否相等。
#include<iostream>
#include<iterator>
#include<vector>
using namespace std;
int main()
{
int arr1[] = {1, 2, 3, 4, 5};
int arr2[] = { 1, 2, 3, 4, 5 };
int *pbeg1 = begin(arr1), *pend1 = end(arr1);
int *pbeg2 = begin(arr2), *pend2 = end(arr2);
bool flag1 = true;
if (pend1 - pbeg1 == pend2 - pbeg2)
{
while (pbeg1 != pend1 && pbeg2 != pend2)
{
if (*pbeg1 != *pbeg2)
{
flag1 = false;
break;
}
pbeg1++;pbeg2++;
}
}
else
{
flag1 = false;
}
vector<int> vec1(5, 42);
vector<int> vec2(5, 42);
bool flag2 = true;
if (vec1 != vec2)
flag2 = false;
cout << flag1 << " " << flag2 << endl;
return 0;
}
练习3.37 下面的程序是何含义,程序的输出结果是什么?
const char ca[] = { 'h', 'e', 'l', 'l', 'o' };
const char *cp = ca;
while (*cp) {
cout << *cp << endl;
++cp;
}
会将ca 字符数组中的元素打印出来。但是因为没有空字符的存在,程序会一直打印到空字符退出循环。
练习3.38 在本节中我们提到,将两个指针相加不但是非法的,而且也没有什么意义。请问为什么两个指针相加没有意义?
指针存放的是内存地址,将地址相加会产生不可预料的结果。
练习3.39 编写一段程序,比较两个string对象。再编写一段程序,比较两个C风格字符串的内容。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int flag1 = 1, flag2 = 1;
string s1("aaaa");
string s2("aaaa");
if (s1 != s2)
flag1 = 0;
char s3[] = "bbbb";
char s4[] = "bbbb";
if (strcmp(s3, s4) != 0)
{
flag2 = 0;
}
cout << flag1 << flag2 << endl;
return 0;
}
练习3.40 编写一段程序,定义两个字符数组并用字符串字面值初始化它们;接着再定义一个字符数组存放前面两个数组连接后的结果。使用strcpy
和strcat
把前两个数组的内容拷贝到第三个数组当中。
#include<cstring>
#include<cstdlib>
using namespace std;
int main()
{
char s1[] = "aaaa";
char s2[] = "BBBB";
char s3[10] = "";
strcat(s3, s1);
strcat(s3, s2);
printf("%s\n", s3);
return 0;
}