「C言語/標準ライブラリ/stdlib.h」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
M Ef3 がページ「C言語/標準ライブラリ/一般ユーティリティ」を「C言語/標準ライブラリ/stdlib.h」に移動しました: 国際標準規格で定義されたヘッダー名
Ef3 (トーク | 投稿記録)
表組み編集。abort()などにC11で追加された_Noreturn関数指定子を補った。
タグ: 2017年版ソースエディター
1 行
{{Navスタブ}}
<!-- ToDo:
C11 で追加された
* int at_quick_exit(void (*func)(void));
* _Noreturn void quick_exit(int status);
つ記載。
(aligned_allocは完了)
* Annex K の追加。
-->
 
{{Nav}}
ヘッダーファイル <code><stdlib.h></code> では、一般的な実用性を持つ5つの型といくつかの関数を宣言し、いくつかのマクロを定義しています<ref name="jtc1-sc22-wg14-n2596-7.22">{{cite book
| url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf
| title= N2596 working draft — December 11, 2020 ISO/IEC 9899:202x (E)
11 ⟶ 20行目:
{|class="wikitable"
|+ 一般ユーティリティの関数の一覧
! !!形式!!機能
|-
!colspan rowspan=25 style="writing-mode: vertical-rl;" scope="row" |数値変換関数
|-
|[[#atof関数|double atof(const char *nptr);]]||文字列をdouble型に変換する。
23 ⟶ 32行目:
|[[#strtol, strtoll, strtoul及びstrtoull関数|long int strtol(const char * restrict nptr, char ** restrict endptr, int base);<br>long long int strtoll(const char * restrict nptr, char ** restrict endptr, int base);<br>unsigned long int strtoul(const char * restrict nptr, char ** restrict endptr, int base);<br>unsigned long long int strtoull(const char * restrict nptr, char ** restrict endptr, int base);]]||文字列を指定した基数でlong int型に変換する。<br>文字列を指定した基数でlong long int型に変換する。<br>文字列を指定した基数でunsigned long int型に変換する。<br>文字列を指定した基数でunsigned long long int型に変換する。
|-
!colspan rowspan=23 style="writing-mode: vertical-rl;" scope="row" |疑似乱数列生成関数
|-
|[[#rand関数|int rand(void);]]||疑似乱数整数を計算する。
29 ⟶ 38行目:
|[[#srand関数|void srand(unsigned int seed);]]||疑似乱数整数の種を与える。
|-
!colspan rowspan=26 style="writing-mode: vertical-rl;" scope="row" |記憶域管理関数
|-
|[[#aligned_alloc関数|void *aligned_alloc(size_t alignment, size_t size);]]||指定したアライメントでメモリを確保する<ref name="aligned_alloc-c11">ISO/IEC 9899:2011(C11)で追加されました。</ref>。
41 ⟶ 50行目:
|[[#realloc関数|void *realloc(void *ptr, size_t size);]]||古いオブジェクトの領域を解放し、新しいオブジェクトへのポインタを返す。
|-
!colspan rowspan=27 style="writing-mode: vertical-rl;" scope="row" |環境に関連する関数
|-
|[[#abort関数|_Noreturn void abort(void);]]||異常プログラム終了を引き起こす。
|-
|[[#atexit関数|int atexit(void (*func)(void));]]||プログラム正常終了時に呼び出される関数を登録する。
|-
|[[#exit関数|_Noreturn void exit(int status);]]||正常プログラム終了を引き起こす。
|-
|[[#_Exit関数|_Noreturn void _Exit(int status);]]||正常プログラム終了を引き起こし、制御をホスト環境に戻す。
|-
|[[#getenv関数|char *getenv(const char *name);]]||環境の並びの中で、一致する文字列を探索する。
55 ⟶ 64行目:
|[[#system関数|int system(const char *string);]]||コマンドプロセッサで文字列を実行する。
|-
!colspan rowspan=23 style="writing-mode: vertical-rl;" scope="row" |探索及び整列ユーティリティ
|-
|[[#bsearch関数|void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));]]||一致する要素を探索する。
61 ⟶ 70行目:
|[[#qsort関数|void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));]]||配列を整列する。
|-
!colspan rowspan=23 style="writing-mode: vertical-rl;" scope="row" |整数算術関数
|-
|[[#abs, labs, 及びllabs関数|int abs(int j);<br>long int labs(long int j);<br>long long int llabs(long long int j);]]||整数jの絶対値を計算する。
67 ⟶ 76行目:
|[[#div, ldiv 及びlldiv関数|div_t div(int numer, int denom);<br>ldiv_t ldiv(long int numer, long int demon);<br>lldiv_t lldiv(long long int numer, long long int denom);]]||商と剰余を計算する。
|-
!colspan rowspan=24 style="writing-mode: vertical-rl;" scope="row" |多バイト文字・ワイド文字変換関数
|-
|[[#mblen関数|int mblen(const char *s, size_t n);]]||バイト数を計算する。
75 ⟶ 84行目:
|[[#wctomb関数|int wctomb(char *s, wchar_t wc);]]||ワイド文字を対応する多バイト文字に変換する。
|-
!colspan rowspan=23 style="writing-mode: vertical-rl;" scope="row" |多バイト文字列・ワイド文字列変換関数
|-
|[[#mbstowcs関数|size_t mbstowcs(wchar_t * restrict pwcs, const char * restrict s, size_t n);]]||多バイト文字の並びを対応するワイド文字の並びに変換する。
81 ⟶ 90行目:
|[[#wcstombs関数|size_t wcstombs(char * restrict s, const wchar_t * restrict pwcs, size_t n);]]||ワイド文字の並びを多バイト文字の並びに変換する。
|-
!colspan rowspan=2 style="writing-mode: vertical-rl;" scope="row" |ランタイム制約処理<sup>'''C11'''</sup>
|-
|colspan=2|<syntaxhighlight lang=c>
136 ⟶ 145行目:
; 機能
:atof関数とは、nptrが指す文字列の最初の部分を、double型の表現に変換する関数である。
:stofa関数は、エラーが発生したときの動作を除けば、
:<syntaxhighlight lang=c>
strtod(nptr, (char **)NULL)
</syntaxhighlight>
:と等価である。
; [https://paiza.io/projects/P_ksve1XbB_z1heeY8IuoA?language=c 例] : <syntaxhighlight lang=c>
; 例
: <syntaxhighlight lang=c>
#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
double d = atof("3.1414XYZ");
{
double d;
 
printf("dの値:%.2f\n", d);
d=atof("3.14");
 
printf("dの値:%.2f\n", d);
}
</syntaxhighlight>
; 実行結果 :<syntaxhighlight lang=text>
dの値:3.14
: </syntaxhighlight lang=c>
 
=== atoi, atol及びatoll関数 ===
<ref>『JISX3010:2003』p.221「7.20.1.2 atoi, atol及びatoll関数」</ref>
395 ⟶ 404行目:
if ((p = (struct Point *)aligned_alloc(_Alignof(struct Point), size)) == NULL) {
puts(strerror(errno));
exit(1EXIT_FAILURE);
}
 
404 ⟶ 413行目:
if ((p = (struct Point *)aligned_alloc(65536, ULONG_MAX)) == NULL) {
puts(strerror(errno));
exit(1EXIT_FAILURE);
}
printf("p = %p\n", p);
454 ⟶ 463行目:
if((p=(int *)calloc(nmemb, sizeof(int)))==NULL){
printf("領域の割り付けができませんでした。\n");
exit(1EXIT_FAILURE);
}
 
509 ⟶ 518行目:
if((p=(int *)malloc(sizeof(int)*size))==NULL){
printf("領域の割り付けができませんでした。\n");
exit(1EXIT_FAILURE);
}
 
554 ⟶ 563行目:
if((p=(int *)malloc(sizeof(int)*size))==NULL){
printf("領域の割り付けができませんでした。\n");
exit(1EXIT_FAILURE);
}
for(i=0; i<size; ++i)
565 ⟶ 574行目:
if((p=(int *)realloc(p, sizeof(int)*size))==NULL){
printf("領域の割り付けができませんでした。\n");
exit(1EXIT_FAILURE);
}
for(i=10; i<size; ++i)
584 ⟶ 593行目:
:<syntaxhighlight lang=c>
#include <stdlib.h>
_Noreturn void abort(void);
</syntaxhighlight>
; 引数
638 ⟶ 647行目:
}
</syntaxhighlight>
 
=== exit関数 ===
<ref>『JISX3010:2003』p.227「7.20.4.3 exit関数」</ref>
643 ⟶ 653行目:
:<syntaxhighlight lang=c>
#include <stdlib.h>
_Noreturn void exit(int status);
</syntaxhighlight>
; 引数
651 ⟶ 661行目:
; 機能
:exit関数とは、正常プログラム終了を引き起こす関数である。
:C11でexit()に [[C言語/中級者向けの話題#Noreturn関数指定子|_Noreturn関数指定子]]が追加されたので、JISCにあった「プログラムが2回以上exit関数の呼出しを行った場合,その動作は未定義とする」に相当する文書( ''Each function is called as many times as it was registered, and in the correct order with respect to other registered functions.'' )は削除されました<ref>『ISO/IEC 9899:2011』p.91「6.7.4 Function specifiers」</ref>。
:プログラムが2回以上exit関数の呼び出しを行った場合、その動作は未定義である。
:exit関数の動作は以下のとおりである。
#atexit関数で登録されたすべての関数を、登録の逆順で呼び出す。ただし、その関数より前に登録されている関数のうちで、その関数の登録時点で既に呼び出されているものに対しては、それらの呼び出しよりも後の呼び出しとなる。登録された関数の呼び出しの途中で、longjmp関数の呼び出し(登録された関数の呼び出しを終了させる。)がある場合、その動作は未定義である。
662 ⟶ 672行目:
int main(void)
{
exit(0EXIT_SUCCESS);
}
</syntaxhighlight>
 
=== _Exit関数 ===
<ref>『JISX3010:2003』p.228「7.20.4.4 _Exit関数」</ref>
670 ⟶ 681行目:
:<syntaxhighlight lang=c>
#include <stdlib.h>
_Noreturn void _Exit(int status);
</syntaxhighlight>
; 引数