标签:style blog http color io os ar 使用 for
我们浏览的网页都会被不同的编码方式编码
例如 :“C++” URL编码(GBK)为 “C%2B%2B”
那么,如何实现解码呢?
通过观察可得url编码的编码规则
1、数字和字母不进行编码。
2、其他符号编码方式为对应ascii码的2位16进制前面加上一个“%”。
例如 “+” 查表可知 对应的16进制数为2B ,所以,“+” 编码成了“%2B”。
程序思路:
定义一个char数组存放需要解码的数据,然后用指针遍历,如果碰到%号则对其后面的两位进行转码,然后指针后移3位。如果碰到数字和字母则输出即可。然后指针后移一位。
1 #include <iostream>
2 //#include <stdio.h>
3
4 using namespace std;
5
6 int change(char *ch)
7 {
8 int n = atoi(ch);
9 if(!n) //n == 0
10 {
11 return(*ch - ‘A‘ + 10);
12 }
13 else if( n >= 1 && n <= 9)
14 {
15 return n;
16 }
17 }
18
19 int main()
20 {
21 int change(char *);
22 char a[20] = {‘\0‘};
23 int z;
24 cin >> a;
25 char *p = a;
26 for( int i = 0; i < 20; i++, p++)
27 {
28 if( int(*p) == 37)
29 {
30 char c[3] = "";
31 char x[2] = {*(p+1)};
32 char y[2] = {*(p+2)};
33 int x1 = change(x);
34 int y1 = change(y);
35 z = 16*x1 + y1;
36 printf("%c",z);
37 p = p + 2;
38 }
39 else if( *p != ‘\0‘)
40 {
41 cout << *p;
42 }
43 if( *p == ‘\0‘)
44 {
45 break;
46 }
47
48 }
49 return 0;
50 }
用到的函数:
注意的点:
1、定义数组char a[20]一定要把数组初始化为空。 否则转码可能出现意想不到的结果。因为你所需要转码的内容可能不能把a的空间占满,那么没有占满的空间数据就是未知的。所以定义的时候最好初始化为空。
(1) char str[10]="";
(2) char str[10]={‘\0‘};
(3) char str[10]; str[0]=‘\0‘;
第(1)(2)种方式是将str数组的所有元素都初始化为‘\0‘,而第(3)种方式是只将str数组的第一个元素初始化为‘\0‘。如果数组的size非常大,那么前两种方式将会造成很大的开销。所以,除非必要(即我们需要将str数组的所有元素都初始化为0的情况),我们都应该选用第(3)种方式来初始化字符串数组。
2、为什么要使用change函数。我们知道,ascii码是可以直接进行加减运算得到对应的16进制数。例如:"2B" = (‘2‘ - ‘0‘) * 16 + (‘B‘ - ‘A‘ + 10)=43 如果是数字字符,直接减字符0,如果是大写字符,直接减字符A,小写同理。B的ascii是66,A的是65,‘B‘ - ‘A‘ = 1 ,则对应的应该是11。那么不使用change函数可以直接运算吗?这里又有一个问题。我们无法确定%号后面的第一位是数字还是字母,所以无法使用公式进行计算,必须先交给change函数判断。int n = atoi(ch); 如果是字母,则返回值为return(*ch - ‘A‘ + 10);(这里只考虑大写的情况),如果是数字,则返回值为return n;
3、最后,判断*p的值是否指向’\0’,如果是 ,则结束循环。
标签:style blog http color io os ar 使用 for
原文地址:http://www.cnblogs.com/Grove/p/4036943.html