sprintf

int sprintf( char *buffer, const char *format[, argument] ... )

対応する

#include <stdio.h>
void main()
{
 char str[256];
 sprintf( str, "%c%d", 65, 123 );
 puts( str );
}


実行結果
A123
C > 標準関数 > 文字列処理関数 | comments (0) | trackbacks (0)

strcat

char *strcat( char *dest, const char *source )

文字列destの後ろに文字列sourceを連結する。

strcat( str, "xyz" );

文字列strに"xyz"をつなぐ
C > 標準関数 > 文字列処理関数 | comments (0) | trackbacks (0)

strchr

char *strchr( const char *str, int c )

文字列strの先頭から文字cを探し、その位置を返す。
見つからない時はNULLを返す。


char *p;
char s[] = "strchr test";
p = strchr( s, 'c' );
puts( p );


ポインタpに文字列s内の文字'c'のあるアドレスが返る。

出力結果
chr tst
C > 標準関数 > 文字列処理関数 | comments (0) | trackbacks (0)

strlen

size_t strlen( const char *str )

strの文字数を返す。
終端のNULLは含まれない。

n = strlen( "abcde" );

nの値は5になる
C > 標準関数 > 文字列処理関数 | comments (0) | trackbacks (0)

strncat

char *strncat( char *dest, const char *source, size_t count )

文字列destの後ろに文字列sourceの先頭count文字を連結する

strncat( s1, s2, 10 );

文字列s1の後ろに文字列s2の先頭10文字をつなぐ
C > 標準関数 > 文字列処理関数 | comments (0) | trackbacks (0)

strncmp

int strncmp( const char *str1, const char *str2, size_t count )

先頭count文字だけ文字列str1と文字列str2を比較する。

戻り値は、string1 と string2 の部分文字列の関係を示す。
戻り値説明
< 0string1 の部分文字列は string2 の部分文字列より小さい
0string1 の部分文字列は string2 の部分文字列と同じ
> 0string1 の部分文字列は string2 の部分文字列より大きい



if ( strncmp( str, "abc", 3 ) == 0 ) {
 ・・・
}


もし文字列strの先頭3文字が"abc"なら処理をする
C > 標準関数 > 文字列処理関数 | comments (0) | trackbacks (0)

strncpy

char *strncpy( char *dest, const char *source, size_t count )

文字列destに文字列sourceの先頭count文字をコピーする
countがsourceの長さ以下の場合は、
コピーされた文字列の終端にnull文字が追加されない。
countがsourceよりも長い場合は、
countの文字数になるまで、コピー先文字列にnull文字が埋め込まれる。

strncpy( s1, s2, 10 );

文字配列s1に文字列s2の先頭10文字をコピーする
C > 標準関数 > 文字列処理関数 | comments (0) | trackbacks (0)

strstr

char *strstr( const char *str, const char *key )

文字列strの先頭から文字列keyを探し、その位置を返す。
見つからない時はNULLを返す。


char *p;
char s[] = "strstr test";
p = strchr( s, "te" );
puts( p );


ポインタpに文字列s内の文字列"te"のあるアドレスが返る。

出力結果
test
C > 標準関数 > 文字列処理関数 | comments (0) | trackbacks (0)

strtok

char *strtok( char *str, const char *delim )

文字列delimの中の各文字を分離記号として、
文字列strの中からトークンを切り出す。
2回目以降はstrにNULLを指定してstrtokを呼び出す。
戻り値がNULLになるまでstrtokを実行すると、
全てのトークンを得る事ができる。


#include <stdio.h>
#include <string.h>

void main()
{
 char s[] = "123,456.789 012/,.:345:678";
 const char delim[] = "/: ,.";
 char *p;

 p = strtok( s, delim );
 printf( "%s\n", p );
 while ( ( p = strtok( NULL, delim ) ) != NULL )
  printf( "%s\n", p );
}


実行結果

123
456
789
012
345
678

C > 標準関数 > 文字列処理関数 | comments (0) | trackbacks (0)

time

time_t time( time_t *timeptr )

西暦1970年1月1日から何秒経ったかを秒数で返す。


#include <stdio.h>
#include <time.h>

void main()
{
 printf( "%ld\n", time( NULL ) );
}


・調べた秒数は戻り値で取得すればよい。
・引数には変数のアドレスではなくNULLを指定する。
・このデータはctime関数を使って読める形にする。
C > 標準関数 > 時間処理 | comments (0) | trackbacks (0)

符号あり右シフト

符号あり整数の右シフト動作は一定していません。
まず正の数の右シフトは左から0がシフトインされます。
負の数の場合は、ANSI Cでは規定していません。
処理系に依存するという事になっています。
その動作には2種類あります。


(1)符号ビットのコピーをシフトインする(算術シフト)
(2)0をシフトインする(論理シフト)


算術シフトは、算術計算に耐えるシフトを意味しています。
例えば-1000を右1ビットシフトしたら-500になるべきだというシフトです。
これに対して論理シフトは、
とにかく指定数だけシフトすればいいというシフトです。
負の数を右にシフトして、結果が正の数になっても構わないというものです。

このように右シフトには2つの方法がありますが、
実際には算術シフトをとっている処理系が大部分です。
それはシフト演算と算術演算とに一貫性がでてくるからです。
このようにシフト演算には処理系依存という要素がありますから
実際の運用にあたっては、
シフト処理は符号無し整数に対して行う
という姿勢が望ましいと言えます。
C > 演算 | comments (0) | trackbacks (0)

シフト演算


#include <stdio.h>
void main()
{
 int b = 1;
 printf( "%d %d\n", b * 2, b << 1 );
 printf( "%d %d\n", b * 4, b << 2 );
 printf( "%d %d\n", b * 8, b << 3 );
 printf( "%d %d\n", b * 16, b << 4 );

 int a = 16;
 printf( "%d %d\n", a / 2, a >> 1 );
 printf( "%d %d\n", a / 4, a >> 2 );
 printf( "%d %d\n", a / 8, a >> 3 );
 printf( "%d %d\n", a / 16, a >> 4 );
}


実行結果

2 2
4 4
8 8
16 16

8 8
4 4
2 2
1 1


シフト対象整数が正の時、
i * 2n と i << n は同じ結果になる。
i / 2n と i >> n は同じ結果になる。

左に1ビットシフトするごとに値は2倍になる
右に1ビットシフトするごとに値は1/2倍になる
C > 演算 | comments (0) | trackbacks (0)