ぼんさい塾

ぼんさいノートと補遺に関する素材や注釈です.ミスが多いので初稿から1週間を経た重要な修正のみ最終更新日を残しています.

文字列の処理

2013-09-10 15:23:16 | 暮らし
progC.pdf
progC-s.pdf
記事一覧

                      文字列の編集

progC-s.pdf に「D9A%文字列の処理」を追加しました.

参考資料([n]は本文でも引用, *.pptは未調査):
[1] 文字列 - Wikipedia
  http://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E5%88%97
[2] 文字コード - Wikipedia
  http://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89
[3] 文字列探索 - Wikipedia
  http://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E5%88%97%E6%8E%A2%E7%B4%A2
[4] 文字列(string)
  http://www.cc.kyoto-su.ac.jp/~yamada/programming/string.html
文字列のための標準ライブラリ関数
[5] 文字列
  http://www.kis-lab.com/serikashiki/C/C08.html
文字コードの判断
[6] 5. ストリングマッチング 5.1 素朴なアルゴリズム
  http://www2.kobe-u.ac.jp/~ky/da2/haihu01.pdf
[7] クヌース-モリス-プラット法 - Wikipedia
  http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%8C%E3%83%BC%E3%82%B9-%E3%83%A2%E3%83%AA%E3%82%B9-%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E6%B3%95
[8] ボイヤー-ムーア文字列検索アルゴリズム - Wikipedia
  http://ja.wikipedia.org/wiki/%E3%83%9C%E3%82%A4%E3%83%A4%E3%83%BC-%E3%83%A0%E3%83%BC%E3%82%A2%E6%96%87%E5%AD%97%E5%88%97%E6%A4%9C%E7%B4%A2%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0
[9] 正規表現 - Wikipedia
  http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE
[10] 第7章 正規表現 - Kent Web
  http://www.kent-web.com/perl/chap7.html
[11] 正規表現メモ
  http://www.kt.rim.or.jp/~kbk/regex/regex.html
[12] Regular-Expressions.info - Regex Tutorial, Examples and ...
  http://www.regular-expressions.info/
[13] ライブラリ関数一覧
  http://www9.plala.or.jp/sgwr-t/lib/lib.html
[14] C言語関数辞典 - string.h
  http://www.c-tipsref.com/reference/string.html
strcpy 関数は・・・領域の重なり合うオブジェクト間でコピーが行われるときの動作は未定義です.
※ progC-s.pdf の strcpy は(K&R-2のサンプルと異なり)領域が重ってもコピーできますが src 側が壊れされます.
注意! strcpy 関数はバッファオーバーフロー (buffer over-flow) を発生させやすい関数の 1 つです.

補足:(1) 線形時間で文字列を検索する方法は progC-e.pdf で演習します.正規表現は progC-e.pdf でも扱いません --- sys.pdf[#62].
(2) string.h にある標準関数を使うときは使用中の領域を壊さないように注意が必要.
  #include < stdio.h>//HTML対策で' '挿入
  #include < string.h>//HTML対策で' '挿入
  int main( ){
    char s1[ ]="abcde", s2[ ]="xyz";
    printf("%p, %p, %s, %s\n", s1, s2, s1, s2);
    strcpy(s2, s1);
    printf("%p, %p, %s, %s\n", s1, s2, s1, s2);
    return 0;
  }
の(BccDevによる)実行結果は
  0012FF84, 0012FF80, abcde, xyz
  0012FF84, 0012FF80, e, abcde
となり,s1[ ]が壊れています.
(3) progC-s.pdf の関数はCの標準ライブラリ関数とは(名前は同じですが)処理内容は異なります.ポインタpの値を確実に変えたいときは「p = NULL; p="";」.
#include < stdio.h>//HTML対策で' '挿入
int strlen(char *p){
  int k=0;

  while(*p != 0){p++; k++;} return k;
}//'\0' == 0
char *strptr(char *p, char *q){
  int k;

  for( ;p[0] != 0; p++){
    for(k = 0; q[k] != 0; k++){
      if(p[k] != q[k]){break;}
    }
    if(q[k] == 0){return p;}

  } return NULL;
}//無駄な比較が多い.
void strcpy(char *p, char *q){
  int n, k;

  n = strlen(q);
  if(p < q){

    for(k = 0; k < = n; k++){p[k] = q[k];}//HTML対策で' '挿入
  }else while(n >= 0){p[n] = q[n]; n--;}
}//文字列qが使えなくなる場合がある.
int main( ){
  char s1[]="abcde", s2[ ]="pqr", *p1="uvwxyzabc", *p2="xyz";
  //char s2[ ]="pqr", s1[]="abcde", *p1, *p2;
  printf("%p, %p, %p, %p\n", s1, s2, p1, p2);
  printf("%s, %s, %s, %s\n", s1, s2, p1, p2);
  p1 = strptr(p1, p2);
  printf("%p, %d, %s\n", p1, strlen(p1), p1);
//
  p1 = NULL; p1 = "";
  printf("%s, %s, %s, %s\n", s1, s2, p1, p2);
  strcpy(p1, s1);
  printf("%s, %s, %s, %s\n", s1, s2, p1, p2);
  strcpy(p1+strlen(p1), s2);
  printf("%s, %s, %s, %s\n", s1, s2, p1, p2);
//
  strcpy(s2, s1);//実行でき,s1が壊される
  printf("%s, %s, %s, %s\n", s1, s2, p1, p2);
  return 0;
}
/*------------------------------------------------
0012FF84, 0012FF80, 0040A132, 0040A13C
abcde, pqr, uvwxyzabc, xyz
0040A135, 6, xyzabc
abcde, pqr, , xyz
abcde, pqr, abcde, xyz
abcde, pqr, abcdepqr, xyz     //pqr0 abcde0
e, abcde, abcdepqr, xyz       //abcd e0de0
                              //s2[] s1[]
-------------------------------------------------*/