头歌C/C++实训 指针实训《去掉字符串首尾空格》
任务要求
任务描述
补充代码,以实现去掉字符串(字符串由平台提供,且已在主函数中获取)首尾空格的功能。具体要求如下:
·对于输入的字符串,去掉该字符串首尾的空格后输出;
·字符串的存储使用一维字符数组,但本关要求使用指针操作。写完程序后,你也会发现使用指针实现会容易得多。
例子与说明
为了方便显示空格,下面给出的测试输入使用下划线 ‘_’ 表示空格。
测试输入:_____asd
预期输出:asd
asd//输入
asd//输出
测试输入:_a_b_c_d
预期输出:a_b_c_d
a b c d //输入
a b c d//输出
基本思路
所需知识
指针
指针是C语言几乎最后的学习的内容,其最厉害的也是最方便的地方就是可以利用指针一个量对数组进行处理,如截断,取位等等。
当然,简单也说明掌握的困难,特别是理解方面。
具体我们在实战中解释。
具体实现
基础所给代码
#include <iostream>
using namespace std;
char * trim(char * str);
int main()
{
char s[1024]; // 定义存储字符串的一维字符数组
// 输入一行字符,可以包含空格
// 输入的字符串存入s中,最多读取个字符,后面自动加上'\0'
cin.getline(s,1024);
cout << trim(s) << endl; // 输出去掉首尾空格后的字符串
return 0;
}
// 函数trim:去掉字符串首尾空格
// 参数:str-字符指针,指向输入的字符串
// 返回值:字符指针,指向去掉首尾空格后的字符串(首地址)
// 提示:可以直接在字符串str中操作
char * trim(char * str)
{
// 请在此添加代码,实现函数trim
/********** Begin *********/
/********** End **********/
}
我们在这串代码中,先判断给我们的几个变量的类型与可利用条件;
第一个是这里的
char * trim(char * str)
这个函数的定义,说明以下:
1.此函数所用值为指针
2.此函数也需要返回指针值
因此,str代表的是输入进来的一个字符串数组对应的指针。
我们对str进行处理即可。
思路展示
首先,题目要求我们去除的是首尾字符。
首位处理: 可直接用if分支判断是不是有空格然后直接将指针移位。
解释一下,指针相当于含两个信息,举个例子:
char *p = a[1024];
此处 p 是数组 a 的指针,p可以代表数组 a 的首位地址(初始情况) ,若输出则可以输出数组 a 所含有的值。
在进行数组中每位比较时,利用指针更加方便。
代码如下:
char *p;
while(*str==' '){
str++;//字符是空格的时候,就把指针后移
}
p=str; //从这里开始赋值str指针的信息给p指针,将先找到末尾,然后p--递减,从末尾开始处理;
此处对str的操作不难理解,
到末尾再次 return str 时指针初始位置已不再是空格处了,已经移动到有字母的地址。
末尾处理: 这里得思路是重新设置一个指针从末尾开始往前移,对同一数组进行处理,具体则是先找到 ‘\0’ 这个字符串截止符,找到截止符就意味着找到了字符串的末尾,再从末尾判断空格。
while(*p!='\0'){
p++;//p一直移动到字符串的结尾
}
p--;
while(p>str&&*p==' '){ //str的位置是开头,确定p移动的底线和处理的条件
*p='\0'; //如果是空格的话,提前截止字符串
p--;
}
return str;
代码展示
char* trim(char* str)
{
char *p = str;
while(*p != '\0')
{
p++;
}
p--;
while(p >= str && *p == ' ')
{
*p = '\0';
p--;
}
p = str;
while(*p == ' ')
{
p++;
}
return p;
}