C言語が他の言語と最も異なる部分は、ポインタ変数で情報を管理できることと、
配列名が要素が並ぶ記憶空間(メモリ)の先頭アドレスを意味していることです。
これは、アセンブラの経験者からすれば、あたり前の処理です。
そして、アセンブラのようにコンピュータ本質を理解していないと正しいプログラムが書けないと
言われるゆえんです。
逆に完全に使えれば、アセンブラに近いレベルで、効率がよく高速で動作する作品が作れます。
C言語の初期学習において、ポインタを最も駆使していると感じるのが文字列でしょう。
なぜならC言語には文字列全体を表現する型がないからです。
単に、文字を並べて記憶した領域の先頭文字位置を(char *型)変数で管理してプログラミングします。
ここで、文字列を中心にポインタを扱う標準の関数を紹介します。
これらの関数定義を理解して、関数を作る時に考え方を真似るとよいでしょう。
これらは、文字の集合に対する関数群ですが、データ対象が文字でない違うデータの集合になった
場合も、同じような考え方が可能だからです。
プロトタイプ宣言 | 概要説明 | ヘッダーfile |
---|---|---|
int puts(char *s); | sが指し示す記憶域に並ぶ文字並びを、'\0'の直前まで標準出力で出力して、最後に'\n'を出力する。失敗時はEOFを返す。 | stdio.h |
char * gets(char *s); | sが指し示す記憶域へ、標準入力から入力した1行の文字列を記憶する。正常時はsと同じ位置を返す。失敗時はNULLを返す | stdio.h |
上記が、入出力関数 | ||
int strlen(char *s) | sが指し示す文字列の長さ(byte数)を返します。(終端の'\0'は含まない範囲) | string.h |
int strcmp(char *s1, char *s2) | s1が指し示す文字列と、s2がが指し示す文字列を比較し、等しいなら0、s1が大きいなら正、s2が大きいなら負の値を返す。 | string.h |
int strncmp(char *s1, char *s2, int n) | strcmpに対して、nの引数が追加され、s1やs2の文字列長がnに満たない場合、比較する範囲が、先頭よりn バイトだけで行なわれる。 | string.h |
char * strcpy(char *a, char *s) | aが指し示す位置に、sが指し示す文字列をコピーして、aを返します。sの文字列を記憶可能な記憶域の先頭アドレスを、aで指定しなければなりません。 | string.h |
char * strncpy(char *a, char *s, int n) | strcpyに対して、nの引数が追加され、sの文字列長がnに満たない場合、コピー範囲はn バイトだけで行なわれる。(その時'\0'は設定されない) | string.h | char * strcat(char *a, char *s) | aが指し示す文字列の最後に、sが指し示す文字列をコピーして、aを返します。つまり文字列の連結に使いますが、aは、連結後の文字列を記憶できる記憶域で指定しなければなりません。 | string.h |
char * strchr(char * s, int c) | sの文字列内において、cの文字を探し、見つかったsの文字列内のアドレスを返します。(見つからない時はNULLを返す) | string.h |
char * strstr(char * s, char * cp) | sの文字列内において、cpの文字列と同じ並びの箇所を探し、見つかったsの文字列内のアドレスを返します。(見つからない時はNULLを返す) | string.h |
上記が、文字列操作関数 | ||
int atoi(char * s) | sが指し示す文字列を整数の値に変換して、その値を返します | stdlib.h |
double atof(char * s) | sが指し示す文字列を実数の値に変換して、その値を返します | stdlib.h |
int sscanf(char * s, char *format, ...) | 入力ストリームの代わりにsが指し示す文字列を、走査(scan)して、foramt文字列内の%の直後の変換指定で変換し、対応する引数が指す記憶域に設定する | stdio.h |
char * itoa( int val, char *a, int radix ) | valの値を、radixを基数として、その文字並びに変換し、aの記憶域に設定します。戻り値はaと同じです。 | stdlib.h |
int sprintf(char * a, char *format, ...) | foramt文字列を、表示しない代わりに、aが指す記憶へ設定します。foramtの文字列内の%の直後の変換指定で、対応する引数を文字列に変換し、aの記憶域へ埋め込む機能があります。 | stdio.h |
上記が、文字列と数値の変換関数 |
Unicode利用時は、システム依存ですが、上記関数の代わりに こちらで示す関数を使います。