カテゴリ: C


ApacheモジュールでURLエンコードしたかったから書いた。
Apacheの関数でap_escape_uriってのがあったけど、
?しかエスケープしてくれなくて
ちょっと違うみたい。

char * url_encode(apr_pool_t *p, char* url){
char *copy = apr_palloc(p, 3 * strlen(url) + 3);
int i;
char *pt = url;
char c;
char *url_en = copy;

for(i = 0; i < strlen(pt); i++){
c = *url;

if((c >= '0' && c <= '9')
|| (c >= 'A' && c <= 'Z')
|| (c >= 'a' && c <= 'z')
|| (c == '\'')
|| (c == '*')
|| (c == ')')
|| (c == '(')
|| (c == '-')
|| (c == '.')
|| (c == '_')){
*url_en = c;
++url_en;
}else if(c == ' '){
*url_en = '+';
++url_en;
}else{
*url_en = '%';
++url_en;

sprintf(url_en, "%02X", c);
url_en = url_en + 2;
}

++url;
}

*url_en = '\0';

return copy;
}

apr_pallocってのはApacheの関数で
メモリを自動で管理してくれるらしい。
この関数が終わってもcopyのメモリはちゃんと保持してくれて、
使い終わったら解放してくれるみたい。

動作は保障しません。
今のとこちゃんと動いてる。

〓たつや〓


このエントリーをはてなブックマークに追加


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';


〓たつや〓


このエントリーをはてなブックマークに追加


C言語でCGIプログラミングに挑戦だ!!
#include <stdio.h>

int main(void){
printf("Content-type: text/html\n\n");
printf("<html><head></head><body>\n");
printf("Hello world!!\n");
printf("</body></html>\n");

return 1;
}

拡張子を.cgiでコンパイルする
gcc -o hello_world.cgi hello_world.c

できた!!
http://bbs.hibinotatsuya.com/hello_world.cgi

目標はCで掲示板です。
やる気出てきた。
やっぱり時代はウェブプログラミングだよね!

〓たつや〓


このエントリーをはてなブックマークに追加


scanf覚えたらプログラムっぽくなってきた。

#include <stdio.h>

#define APPLE 100
#define ORANGE 200

int main(void)
{
int x, y, answer;

printf("how many apple?? ");
scanf("%d", &x);

printf("how many orange?? ");
scanf("%d", &y);

answer = (x * APPLE) + (y * ORANGE);
printf("answer is %d\n", answer);

return 0;
}


〓たつや〓


このエントリーをはてなブックマークに追加


こんにちはC言語野郎です。
人生初のコンパイルをしました。

vi sample.c

#include <stdio.h>

int main(void)
{
int num = 1;

printf("%d\n", num);

return 0;
}


コンパイルします。
Linuxの場合です。
gcc -o sample sample.c


実行
./sample


結果
1


C言語は型にきびしい。

〓たつや〓


このエントリーをはてなブックマークに追加


現在無職なんですけど、C/C++の職業訓練にいくことになった。
id:phaさんの記事↓とか見てええな~と思ってた。

知らないと損する職業訓練

いろいろ授業内容とか見てて、
Linux環境でC/C++みたいな授業があってバッチリやんって思ってコレにした。
PHPしかできない文系プログラマなので、
前からC言語を勉強したいな~と思ってた。

失業保険 + 交通費 + 1日500円をもらいつつ
プログラミングの勉強ができるなんてとても素敵な制度ですね!

これでなんちゃってプログラマーから卒業やーー!!!

〓たつや〓


このエントリーをはてなブックマークに追加

↑このページのトップヘ