String相关问题
1.用特定的间隔符号将句子分隔成单词,倒转非数字的单词
2.替换特定字符
新字符串增长,从后往前赋值
新字符串剪短,从前往后赋值
代码如下:
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
/*
String相关问题
2017-8-21
*/
//1.反转句子
//判断间隔字符
bool isGap(char *c)
{
return (*c == ' ' || *c == ',' || *c == '.');
}
//是否数字
bool isNumber(char *c)
{
if (*c<'0' || *c>'9')
return false;
return true;
}
//是否需要反转
bool needReverse(char *sentence, int *offset)
{
int length = strlen(sentence);
bool needReverse = false;
*offset = 0;
while (!isGap(sentence + (*offset)) && (*offset) < length)
{
if (!isNumber(sentence + (*offset)))
{
needReverse = true;
}
(*offset)++;
}
return needReverse;
}
//反转单词
void ReverseWord(char *c, int length)
{
int i = 0;
int j = length - 1;
while (i < j)
{
swap(c[i], c[j]);
i++;
j--;
}
}
//反转句子
void reverseSentence(char *sentence)
{
int length = strlen(sentence);
int offset;
for (int i = 0; i < length;)
{
if (needReverse(sentence + i, &offset))
{
ReverseWord(sentence, offset);
}
i += (offset + 1);
}
}
//2.空格替换为%20
//检测特定字符,返回下标
int findChar(char *src, int index, char c)
{
int len = strlen(src);
for (int i = index; i < len; i++)
{
if (src[i] == c)
return i;
}
}
//空格替换为%20
char* replaceSpace(char *src)
{
char *newStr;//新字符串
char *repStr = "%20";
int len = strlen(src);
newStr = (char*)malloc(sizeof(char)*(len + 2));
memset(newStr, 0, sizeof(char));
int pos = strchr(src, ' ') - src;
for (int i = len - 1; i > pos; i--)
newStr[i + 2] = src[i];
for (int i = 0; i < 3; i++)
newStr[pos+i] = repStr[i];
for (int i = 0; i < pos; i++)
newStr[i] = src[i];
return newStr;
}
//%20替换为空格
char* replace20(char *src)
{
char *newStr;//新字符串
char *repStr = " ";
int len = strlen(src);
newStr = (char*)malloc(sizeof(char)*(len - 2));
memset(newStr, 0, sizeof(char));
int pos = strstr(src, "%20") - src;
for (int i = 0; i < pos; i++)
newStr[i] = src[i];
newStr[pos] = ' ';
for (int i = pos + 1; i < len - 2; i++)
newStr[i] = src[i + 2];
return newStr;
}
int main()
{
//char *c = "word";//字符串常量,无法修改,报错
//字符数组
char c[] = "word";
ReverseWord(c, 4);
cout << "采用字符数组反转后的单词:"<< c << endl;
//堆上开辟内存
char *temp = "word";
char *c1 = (char*)malloc(sizeof(char)*(strlen(temp) + 1));
strcpy(c1, temp);
ReverseWord(c1, 4);
cout <<"采用堆上开辟内存反转后的单词:" << c << endl;
//释放内存
free(c1);
cout << "c1内存已释放" << endl;
char *str = "Big mac";
str = replaceSpace(str);
cout << "%20替换空格:" << str << endl;
str = "Big%20mac";
str = replace20(str);
cout << "空格替换%20:" << str << endl;
return 0;
}
运行结果: