习题一:获取字符串长度
描述
- 键盘输入一个字符串,编写代码获取字符串的长度并输出,要求使用字符指针实现。
输入描述
- 键盘输入一个字符串
输出描述
- 输出字符串的长度
示例
输入:
helloworld
输出:
10
解析
- 定义一个指针指向字符串开头。
- 只要指针对应元素不是’\n’,将指针后移,同时长度加1。
代码实现
#include <iostream>
using namespace std;
int main() {
char str[100] = { 0 };
cin.getline(str, sizeof(str));
int len=0;
char *p=str;
//只要指针没有指向换行符位置
while(*p!='\0'){
//长度加1,指针p后移
len++;
p++;
}
cout<<len<<endl;
return 0;
}
习题二:复制部分字符串
描述
- 键盘输入一个长度为len(1 <= len < 30)的字符串,再输入一个正整数 m(1 <= m <= len),将此字符串中从第 m 个字符开始的剩余全部字符复制成为另一个字符串,并将这个新字符串输出。要求用指针处理字符串。
输入描述
- 键盘输入一个长度为len(1 <= len < 30)的字符串,再输入一个正整数 m(1 <= m <= len)
输出描述
- 输出复制的新字符串
示例
输入:
helloworld
6
输出:
world
解析
题目所给的代码中,输入的字符串是一个字符数组,采用getline函数输入,这样会在输入的末尾增加一个’\0’表示字符串的结束,如果长度小于数组长度,输入所有字符后加’\0’,如果长度大于数组长度,截断输入的前面部分再在最后加’\0’。
我们准备一个新串来保存复制后的字符串,因为原串大小不会超过30,因此新串的大小也不会超过30.
题目要求使用指针,我们可以用两个指针,指针p一开始指向原串的第m个位置,指针q一开始指向新串的起始位置。然后利用指针p遍历原串,到末尾的’\0’结束,遍历过程中像指针q指向的地址复制指针p指向元素的值,然后指针同步后移。
代码实现
#include <iostream>
using namespace std;
int main() {
char str[30] = { 0 };
cin.getline(str, sizeof(str));
int m;
cin >> m;
// write your code here......
char copystr[30] = { 0 };
char* p = str + m - 1; //指向字符数组第m个元素
char* q = copystr;
while(*p != '\0'){ //直到字符串结果
*q = *p; //复制
p++;; //两边指针都后移
q++;
}
cout << copystr << endl;
return 0;
}
习题三:编写函数实现两数交换(指针方式)
描述
- 键盘输入一个长度为len(1 <= len < 30)的字符串,再输入一个正整数 m(1 <= m <= len),将此字符串中从第 m 个字符开始的剩余全部字符复制成为另一个字符串,并将这个新字符串输出。要求用指针处理字符串。
输入描述
- 键盘输入2个整数 m 和 n
输出描述
- 输出交换后m 和 n 的值,中间使用空格隔开
示例
输入:
2
3
输出:
3 2
代码实现
using namespace std;
// write your code here......
void swap(int *p, int *q);
void swapp(int &a, int &b);
int main() {
int m, n;
cin >> m;
cin >> n;
// write your code here......
// swap(m,n); // 指针变量
swapp(m,n); //引用变量
cout << m << " " << n << endl;
return 0;
}
void swap(int *p, int *q)
{
int temp = *p;
*p = *q;
*q = temp;
}
void swapp(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
习题四:利用指针遍历数组
描述
- 键盘随机输入 6 个整数,将这些数据保存到数组中,利用指针遍历数组中的元素并打印。
输入描述
- 键盘随机输入 6 个整数
输出描述
- 输出数组中的所有元素,每个元素中间使用空格隔开
- 例如:10 20 30 40 50 60
示例
输入:
10
20
30
40
50
60
输出:
10 20 30 40 50 60
解析
- 利用指针遍历数组, 数组名就是数组第一个元素的地址
- 因此将地址范围知道,就可以访问每一个元素的值
- 这里的指针4个字节(64位的话8个字节)作为一整块
代码实现
#include <iostream>
using namespace std;
int main() {
int arr[6] = { 0 };
int* ptr = arr;
int len = sizeof(arr) / sizeof(int);
for (int i = 0; i < len; i++) {
cin >> arr[i];
}
for (ptr ; ptr < arr + len ; ptr++)
{
cout << *ptr<< " ";
}
return 0;
}
习题五:牛牛的新数组求和
描述
- 牛牛学习了指针相关的知识,想实现一个 int cal(int *array,int n) 的函数求出长度为 n 的数组的和。
输入描述
- 第一行输入一个正整数 n ,表示数组的长度
- 第二行输入 n 个正整数,表示数组中每个数字的值
输出描述
- 实现 int cal(int *array,int n) 求出数组array的和
示例
输入:
5
2 8 1 9 5
输出:
25
代码实现
#include <iostream>
using namespace std;
int cal(int *array,int n){
int *p = array;
int sum=0;
for(int i=0;i<n;i++){
sum+=*p;
p++;
}
return sum;
}
int main(){
int n=0;
cin>>n;
int array[n];
for(int i=0;i<n;i++){
cin>>array[i];
}
cout<<cal(array,n);
return 0;
}
习题六:牛牛的排序
描述
- 牛牛试图给一个长度为 n 整数数组排序,即实现一个 void sort(int *array,int n)
输入描述
- 第一行输入一个正整数 n ,表示数组长度。
- 第二行输入 n 个正整数,表示数组中每个元素的值
输出描述
- 输出排序后的数组
示例
输入:
5
2 9 8 1 3
输出:
1 2 3 8 9
代码实现
#include<stdio.h>
void sort (int*arr,int n) //冒泡排序
{
int i,j=0;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1-i;j++)
{
if(arr[j]>arr[j+1])
{
int tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
}
for(i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
}
int main()
{
int n,i=0;
scanf("%d",&n);
int arr[100]={0};
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
sort(arr,n);
return 0;
}