Problem Description
Uniform Resource Identifiers (or URIs) are strings like http://icpc.baylor.edu/icpc/, mailto:foo@bar.org, ftp://127.0.0.1/pub/linux, or even just readme.txt that are used to identify a resource, usually on the Internet or a local
computer. Certain characters are reserved within URIs, and if a reserved character is part of an identifier then it must be percent-encoded by replacing it with a percent sign followed by two hexadecimal digits representing the ASCII code of the character.
A table of seven reserved characters and their encodings is shown below. Your job is to write a program that can percent-encode a string of characters.
Character Encoding " " (space) %20 "!" (exclamation point) %21 "$" (dollar sign) %24 "%" (percent sign) %25 "(" (left parenthesis) %28 ")" (right parenthesis) %29 "*" (asterisk) %2a |
Input
The input consists of one or more strings, each 1–79 characters long and on a line by itself, followed by a line containing only "#" that signals the end of the input. The character "#" is used only as an end-of-input marker and will
not appear anywhere else in the input. A string may contain spaces, but not at the beginning or end of the string, and there will never be two or more consecutive spaces.
|
Output
For each input string, replace every occurrence of a reserved character in the table above by its percent-encoding, exactly as shown, and output the resulting string on a line by itself. Note that the percent-encoding for an asterisk
is %2a (with a lowercase "a") rather than %2A (with an uppercase "A").
|
Sample Input
Happy Joy Joy! http://icpc.baylor.edu/icpc/ plain_vanilla (**) ? the 7% solution # |
Sample Output
Happy%20Joy%20Joy%21 http://icpc.baylor.edu/icpc/ plain_vanilla %28%2a%2a%29 ? the%207%25%20solution |
import java.io.FileInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
import java.io.StreamTokenizer;
public class Main implements Runnable
{
private static final boolean DEBUG = false;
private BufferedReader cin;
private PrintWriter cout;
private StreamTokenizer tokenizer;
private String s;
private void init()
{
try {
if (DEBUG) {
cin = new BufferedReader(new InputStreamReader(
new FileInputStream("d:\\OJ\\uva_in.txt")));
} else {
cin = new BufferedReader(new InputStreamReader(System.in));
}
cout = new PrintWriter(new OutputStreamWriter(System.out));
//tokenizer = new StreamTokenizer(cin);
} catch (Exception e) {
e.printStackTrace();
}
}
private String next()
{
try {
/*
tokenizer.nextToken();
if (tokenizer.ttype == StreamTokenizer.TT_EOF) return null;
else if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) {
return String.valueOf((int)tokenizer.nval);
} else return tokenizer.sval;
*/
return cin.readLine();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private boolean input()
{
s = next();
if ("#".compareTo(s) == 0) return false;
return true;
}
private void solve()
{
StringBuilder sb = new StringBuilder();
for (int i = 0, len = s.length(); i < len; i++) {
char ch = s.charAt(i);
if (ch == ' ') sb.append("%20");
else if (ch == '!') sb.append("%21");
else if (ch == '$') sb.append("%24");
else if (ch == '%') sb.append("%25");
else if (ch == '(') sb.append("%28");
else if (ch == ')') sb.append("%29");
else if (ch == '*') sb.append("%2a");
else sb.append(ch);
}
cout.println(sb.toString());
cout.flush();
}
public void run()
{
init();
while (input()) {
solve();
}
}
public static void main(String[] args)
{
new Thread(new Main()).start();
}
}