27じゃないけど、単に標準入力から読んでデコードして標準出力に書き出すだけならこれでいいかな。
きちんとテストしていないけど。一度全てバッファに取り込んだ方がいいかな?
#include <stdio.h>
#include <stdlib.h>
int main()
{
char s[3]={0};
int c;
while((c=getchar())!=EOF){
switch(c){
case '+':
putchar(' ');
break;
case '%':
s[0]=((c=getchar())==EOF)?'\0':c;
s[1]=((c=getchar())==EOF)?'\0':c;
putchar(strtol(s,NULL,16));
break;
default:
putchar(c);
break;
}
}
return 0;
}