练习3.37
下面的程序是何含义,程序的输出结果是什么?
const char ca[] = {'h', 'e', 'l', 'l', 'o'};
const char *cp = ca;
while(*cp){
cout << *cp << endl;
++cp;
}
解答:
在答应出hello之后,输出若干乱码。
为了测试字符串越界访问之后会产生什么样的结果(?)
练习3.38
在本节中我们提到,将两个指针相加不但非法,而且也没有什么意义。请问为什么两个指针相加没什么意义?
解答:
两个指针能相加的话,得到的地址没有办法使用。
因为这个地址不清楚是一个什么样的地址。
练习3.39
编写一段程序,比较两个string对象。再编写一段程序,比较两个C风格字符串的内容。
解答:
string对象可以直接进行==操作。
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
int main(){
const char *a = "hello";
const char *b = "hello";
if (strlen(a) != strlen(b)){
cout << "not equal" << endl;
return -1;
}
for (; *a != '\0' && *b != '\0'; ++a, ++b){
if (*a != *b){
cout << "not equal" << endl;
return -1;
}
}
cout << "equal" << endl;
return 0;
}
练习3.40
编写一段程序,定义两个字符数组并用字符串字面值初始化它们;接着在定义一个字符数组存放前两个数组链接后的结果。使用strcpy和strcat把起那两个数组的内容拷贝到第三个数组中。
解答:
这里定义四个数组吧,这样好理解一些。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int main(){
const char *a = "hello";
const char *b = "world";
char c[100];
char res[1000];
strcpy(c, a);
strcat(c, b);
strcpy(res, c);
cout << c << endl;
cout << res << endl;
}
第一行的宏定义需要在VS里面添加,应为strcpy是个线程不安全的函数,VS会提示你使用strcpy_s。
当加上这个宏,VS就不会再报错了。