12,964
回編集
(ページの作成:「== メモリ領域を動的に確保する == C言語で、メモリ領域を動的に確保するには、stdlib.hのmalloc関数を使用する。<br> <source lang="c"…」) |
|||
368行目: | 368行目: | ||
} | } | ||
printf("\n"); | printf("\n"); | ||
return EXIT_SUCCESS; | |||
} | |||
/* 比較関数 */ | |||
int compare(const int *val1, const int *val2) | |||
{ | |||
if ( *val1 < *val2 ) | |||
{ | |||
return -1; | |||
} | |||
else if ( *val1 == * val2 ) | |||
{ | |||
return 0; | |||
} | |||
else | |||
{ | |||
return 1; | |||
} | |||
} | |||
</source> | |||
<br><br> | |||
== 配列やメモリ領域の内容から文字を探索する == | |||
C言語で、配列やメモリ領域の内容から文字を探索するには、string.hのmemchr関数を使用する。<br> | |||
<br> | |||
memchr関数は、sが指すオブジェクトの先頭からn文字分検索して、文字cが最初に現れる位置を探索する関数である。<br> | |||
なお、探索中はsが指すオブジェクトとcはunsigned char型として解釈される。<br> | |||
memchr関数は、strchr関数と似ているが、'\0'があっても探索を続ける。<br> | |||
<br> | |||
memchr関数は、文字が見つかった場合は探し出した文字へのポインタを返し、文字が見つからなかった場合はNULLを返す。<br> | |||
memchr関数を利用すると、メモリ領域の中で指定した文字が現れる位置を探すことができる。<br> | |||
<source lang="c"> | |||
#include <string.h> | |||
void *memchr (const void *s, int c, size_t n); | |||
</source> | |||
<br> | |||
以下の例では、memchr関数を使用して、char型の配列を探索している。<br> | |||
<source lang="c"> | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <string.h> | |||
#define N 256 | |||
int main(void) | |||
{ | |||
char s[] = {'S', 'n', 'o', 'o', 'p', 'y', '\0', 'z'}; | |||
char *ret; | |||
int c; | |||
/* 入力 */ | |||
puts("文字を入力してください."); | |||
c = getchar(); | |||
/* s が指す配列中に c があるか? */ | |||
if ((ret = (char *)memchr(s, c, sizeof(char) * N)) != NULL) | |||
{ | |||
printf("%cは%d番目にありました.\n", c, ret - s); | |||
} | |||
else | |||
{ | |||
printf("%cはありませんでした.\n", c); | |||
} | |||
return EXIT_SUCCESS; | |||
} | |||
</source> | |||
<br><br> | |||
== 配列やメモリ領域の内容から任意の値を探索する == | |||
C言語で、配列やメモリ領域の内容から任意の値を探索するには、stdlib.hのbsearch関数を使用する。<br> | |||
<br> | |||
bsearch関数は、baseが指すオブジェクトの配列(要素数がnmemb個、各要素の大きさがsizeである配列)から、<br> | |||
keyが指すオブジェクトに一致する要素を探索する関数である。<br> | |||
なお、baseが指す配列は昇順に整列(ソート)されている必要がある。<br> | |||
<source lang="c"> | |||
#include <stdlib.h> | |||
void *bsearch (const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); | |||
</source> | |||
<br> | |||
bsearch関数の引数は、以下の通りとなる。<br> | |||
* key: 探索キー | |||
* base: 探索する配列 | |||
* nmemb: 配列の要素数 | |||
* size: 配列の個々の要素のサイズ | |||
* compar: 比較関数 | |||
<br> | |||
bsearch関数を使用するには、事前にプログラマが比較関数を実装する必要がある。また、比較関数は以下のルールに基づいて実装する。<br> | |||
比較関数は、keyへのポインタを第1引数とし、配列要素へのポインタを第2引数として呼び出される。<br> | |||
* 第1引数が第2引数より小さい場合 : 0より小さい値を返す | |||
* 第1引数が第2引数と一致する場合 : 0を返す | |||
* 第1引数が第2引数よりも大きい場合 : 0より大きい値を返す | |||
<br> | |||
以下の例では、bsearch関数を使用して、int型の配列を探索している。<br> | |||
<source lang="c"> | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
int compare(const int *val1, const int *val2); | |||
int main(void) | |||
{ | |||
int ary[] = {1, 2, 3, 4, 5, 6, 7, 8}; | |||
int key, *result; | |||
int n = sizeof(ary) / sizeof(ary[0]); | |||
/* keyを入力 */ | |||
scanf("%d", &key); | |||
/* 探索 */ | |||
result = bsearch(&key, ary, n, sizeof(int), (int (*)(const void *, const void *))compare); | |||
if ( result == NULL ) | |||
{ | |||
fprintf(stderr, "%dは見つかりませんでした.\n", key); | |||
} | |||
else | |||
{ | |||
printf("%dは配列の%d番目の要素です.\n", key, (int)(result - &ary[0])); | |||
} | |||
return EXIT_SUCCESS; | return EXIT_SUCCESS; |