URLからプロトコルを取り出す
HTTP Client 作成の一環で、引数に渡された文字列をURLと想定し、そこからプロトコル部分を抜き出すという処理を書いてみた。Cには、期待する形で使用できるsubstringがなかったのでそれを自作し、その自作したsubstringを使用する形で書いてみた。
#include <stdio.h> #include <stdlib.h> #include <string.h> char * substring(const char str[], int s, int e){ int start = s; int end = e; int length = end - start; if( length < 0 ){ int temp = start; start = end; end = temp; length = length * -1; } if( end > strlen(str) ){ end = strlen(str); length = end - start; } char * value = (char *)malloc(sizeof(char) * (length + 1)); int i = 0; while( i < length ){ value[i] = str[start + i]; i++; } value[length] = '\0'; return value; } char * get_protocol(const char * url){ char *value = (char *)malloc(sizeof(char)); char * delimiter = "://"; int length = strlen(url); int loop = length - strlen(delimiter); int i; for( i = 0 ; i < loop ; i++ ){ if( url[i] == delimiter[0] ){ i++; if( url[i] == delimiter[1] ){ i++; if( url[i] == delimiter[2] ){ i++; break; } else { continue; } } else { continue; } } else { continue; } } if( i != loop ) { // url includes "://". // substring 2nd argument is less i than delimiter length. value = substring(url, 0, (i - strlen(delimiter))); } else { value[0] = '\0'; } return value; } int main(int argc, char * args[]){ char * protocol = get_protocol(args[1]); printf("%s\n", protocol); return 0; }
単純にstrstr関数を使用できなかったのもイタい。strstr関数は、合致した以降の文字列を返すような実装になっているが、単純に何文字目で合致したかを返す関数があると楽かもしれない。この部分を切り出すべきだろうか。