给定字符串(ASCII码0-255)数组,请在不开辟额外空间的情况下删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。例如:" i am a little boy. ",变成"i am a little boy",语言不限,但不要用伪代码作答,函数输入输出请参考如下的函数原型:
1
2
|
C++函数原型: void FormatString( char str[], int len){ } |
分析:1考虑用一个指针从头开始遍历整个字符串,完成查询字符串空格的情况,根据几种情况告诉第二个指针该怎么运动,怎么复制。
具体思路如下:
1先驱指针开始查找第一个不是空格的字符,找到时,后继指针与先驱指针同时开始运动,并完成复制。
2当先驱指针再次遇到空格时停止,后继指针停止。先驱指针继续前进找到下一个不是空格的字符时停止。
3如果此时先驱指针没有到末尾,那么后继指针前进一位并复制一个空格,重复第二步工作。
4直到前驱指针指到末尾,遍历结束结束,此时后继指针前进一步,并加一个‘\0’结尾。
代码如下:
// FormatString.cpp : 定义控制台应用程序的入口点。
/*
@mishidemudong
@2015-8-13-16:30
*/
//
#include "stdafx.h"
#include<iostream>
using namespace std;
void FormatString(char str[], int len)
{
if (str == NULL || len < 0)
return;
int i = 0 , j = 1;
while (j<len)
{
if (i < 1 && str[i] == ' ')
{
while (str[j] == ' '&&j < len)
{
j++;
}
while (str[j] != ' ' )
{
str[i++] = str[j++];
}
}
if (i >= 1 && str[j] == ' '&&j<len)
{
while (str[j] == ' '&&j < len)
j++;
if (str[j] != ' '&&str[j] != '\0')
{
str[i++] = ' ';
while (str[j] != ' ')
str[i++] = str[j++];
}
else if (str[j] == '\0')
{
str[i] = '\0';
break;
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char str[] = " i am a little boy. ";
int len=1;
for (int i = 0; str[i] != '\0'; i++) len++;
FormatString(str, len);
printf("%s", str);
return 0;
}