C言語で掲示板作った!
ひろったコードをアレンジして作った。
http://bbs.hibinotatsuya.com/
#include <stdio.h>
#include <stdlib.h>
#define FNAME "comments.txt"
char* url_decode(char*, long);
int main(void){
long len;
char* clen;
char* data;
char* comment;
int i;
FILE* fp;
clen = getenv("CONTENT_LENGTH");
len = atol(clen);
data = malloc(len + 1);
scanf("%s", data);
for(i = 0; i < len; i++){
if(data[i] == '='){
data = data + (i + 1);
len = len - (i + 1);
break;
}
}
comment = url_decode(data, len);
free(data);
fp = fopen(FNAME, "a");
if(fp == NULL){
return 1;
}
fprintf(fp, "%s\n", comment);
fclose(fp);
printf("Content-type: text/html\n\n");
printf("<html>\n");
printf("<head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"></head>\n");
printf("<body>\n");
printf("書き込みました<br>\n");
printf("<a href=\"http://bbs.hibinotatsuya.com/\">戻る</a>\n");
printf("</body></html>\n");
return 0;
}
char* url_decode(char* data, long len){
char* comment;
char buf;
int i, j;
comment = malloc(len + 1);
for(i = 0, j = 0; i < len; i++, j++){
if(data[i] == '+'){
comment[j] = ' ';
continue;
}
if(data[i] != '%'){
comment[j] = data[i];
continue;
}
buf = data[++i] >= 'A' ? data[i] - 'A' + 10 : data[i] - '0';
buf = buf * 16;
buf += data[++i] >= 'A' ? data[i] - 'A' + 10 : data[i] - '0';
comment[j] = buf;
}
comment[i] = '\0';
return comment;
}
この3行がよくわからん。
16進数の文字列を文字コードに変換みたいな感じだと思うけど…。
誰か解説してください。
buf = data[++i] >= 'A' ? data[i] - 'A' + 10 : data[i] - '0';
buf = buf * 16;
buf += data[++i] >= 'A' ? data[i] - 'A' + 10 : data[i] - '0';
〓たつや〓