IT系メモ

興味のあったことや、勉強したことなどをメモしていきます。

C言語

文字入力

printfは出力した文字数を返す。scanfは正しく変換された項目の数を返すので入力エラーチェックに使える。

空文字

ASCIIコードにおいて、空文字はすべて0x20のスペースよりも小さい値になっている。よって文字列中で空白文字を調べるには

if ( i <= ' ' )

のようにする。ループ中で使用するときは、先に行末の'?0'を調べておかないと無限ループになることがある。

scanf()によって残るバッファ処理

今までfflush(stdin)でどうして処理できないんだろうと思っていたら、この方法はWindowsでは有効でも、Linuxでは駄目だってことが判明。

文字検索

abcdefg hijklmnopq rstuvwxyz

上のような文字列が存在し、このある文字列を検索したい。たとえば"nopq"を検索するとする。


先ず始めに対象とする文字列を、検索したい文字列の数ごとに区切る。"nopq"は4文字なので、4文字ごとに区切る。

'abcd' 'efg ' 'hijk' 'lmno' 'pq r' 'stuv' 'wxyz'

これを一つの区切りごとに検索したい文字列"nopq"と比較する。ここで見つかれば終了となるが、見つからない場合は区切りを右にずらしていくことになる。ずらす回数は検索したい文字数と同じになる。ここでは"nopq"は4文字なので、4回繰り返せば良い。比較した回数は7回。


右に1回ずらすと

a 'bcde' 'fg h' 'ijkl' 'mnop' 'q rs' 'tuvw' xyz

最後の"xyz"は検索したい文字"nopq"の文字数に足りないので比較対象から除外することができる。比較した回数は6回。


右に2回ずらすと

ab 'cdef' 'g hi' 'jklm' 'nopq' ' rst' 'uvwx' yz

比較した回数は6回。最大でも検索したい文字列の回数だけずらせば見つかることになる。このやり方だと検索したい文字数が多いほど、比較する回数が少なくて済む。


行の始めから何文字目かは

”検索したい文字数 * 比較した回数-1 + ずらした回数 +1”

REPLACEとINSERT

*s1="文字列"
*s2="文字列"
sprintf(str,"%s%s",s1,s2);

こんな感じでできないかなぁ。Replaceの場合は見つけた文字の始めと後で3つにポインタを分割。んでsprintfで前の文字列と置き換える文字列と後の文字列の3つを繋げる。Insertは前後の2つに分けて、あとは挿入するものと3つ繋げればいいような。

検索

使える関数

  1. strpbrk()
  #include 
  char *strpbrk( const char *文字列1, const char *文字列2 );
文字列2 に含まれる文字が最初に文字列1 に現れる位置のポインタを返す関数である。
見つからなかった場合にはNULLが返される。
  1. strstr()
#include 
  char *strstr( const char *文字列1, const char *文字列2 );
文字列1 を検索して文字列2 が最初に出てくる位置のポインタを返す関数である。
発見できなかった場合にはNULLを返す。
  1. strchr()
 #include 
  char *strchr( const char *文字列, int 文字 );
文字 が文字列 の中で最初に現れる位置のポインタを返す 関数である。
もし文字 が見つからなかった場合にはNULLを返す。
  1. realloc()
#include 
  void *realloc( void *ptr, size_t サイズ );

ポインタ が指すメモリオブジェクトのサイズをサイズ に変更する関数である。
サイズ は元のサイズよりも大きくても小さくても良い。
返値は新しいメモリ領域へのポインタである。
エラーが発生した場合にはNULLが返される。

強制終了

abort()

#include 
  void abort( void );
現在のプログラムを強制終了させる関数である。 
実装依存であるが、実行失敗を表す値を返値として返す。