面试题4:替换空格

题目链接:http://ac.jobdu.com/problem.php?pid=1510

思路:要得到替换后的字符串,显然可以创建一个新的字符串,利用两个指针来来完成操作。假如要求在原字符串上进行替换,

我们只能从后往前遍历原字符串,同时更新得到替换后的字符串。具体方法是,先遍历一遍字符串,记录下有多少个空格,从

而可以计算出替换后的字符串长度(一个空格增加两个字符长度)。利用两个下标,一个初始化原字符串的结尾,一个初始化

为替换后的字符串的结尾。当前者不为空格时,直接复制给后者,然后都向前更新一位。前者为空格时,对应更新后者的三个

字符。当下标相同时,证明空格已经替换完了。

小知识:

在网络编程中,如果URL(统一资源定位器)参数中含有特殊字符,如空格、'#'等,可能导致服务器端无法获取正

确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换规则是在'%'后面跟上ASCII码的两位16进制表示。

注意:

1、利用scanf输入字符串时,会忽略行开头的所有空格字符,并以空格,制表符,换行符作为结束输入标志,换行符残留在缓冲区

2、使用getchar可以读取scanf语句执行后,缓冲区留下的换行符。

3、gets读入以任何字符开始的字符串,以换行符结束,但之后会丢弃换行符并以''代替。

4、c语言里提供了清空缓冲区的函数fflush(stdin).

5、使用格式控制scanf("%[^ ]", string),自己取出缓冲区的残留数据。

code:

 1 #include <cstring>
 2 #include <cstdio>
 3 using namespace std;
 4 const int MAXN = 1000005;
 5 char myStr[MAXN];
 6 int main()
 7 {
 8     while (gets(myStr) != NULL)
 9     {
10         int numOfSp = 0;    // 记录空格数量
11         int len = strlen(myStr);
12         for (int i = 0; i < len; ++i)
13         {
14             if (myStr[i] == 32)
15             {
16                 ++numOfSp;
17             }
18         }
19         int i = len;
20         int j = len + numOfSp * 2;
21         while (i != j)
22         {
23             // 不是空格直接复制
24             if (myStr[i] != 32) myStr[j--] = myStr[i--];
25             // 是空格进行替换
26             else
27             {
28                 myStr[j--] = '0';
29                 myStr[j--] = '2';
30                 myStr[j--] = '%';
31                 i--;
32             }
33         }
34         puts(myStr);
35     }
36     return 0;
37 }
原文地址:https://www.cnblogs.com/ykzou/p/4401646.html