20260421_3


文字列


Cにおける文字とは?

Cでは文字は番号(文字sコードによって表現)

charでは文字コードを格納している(ASCIIとか、Unicodeとか)

文字コードは後方互換が必要

人は文字コードを覚えなくてもいいchar moji='A';ではmojiにはAの文字コード65が格納される


文字列については?

Cでは文字列を表す方が存在しないため、char型配列で扱う

(例えばJavaにはStringクラスがある)

文字列の終わりは\0によって表現

\0は一文字扱いのNULL文字

エスケープ文字

  • \n→改行
  • \"→”
  • \\→\
  • \0→NULL文字
#define SIZE 5
char filename[SIZE];

とした場合、終端文字が必要なので長さ4以下の文字までしか扱えない

''""の違い

文字は''

文字列の先頭アドレスは""で表現する

'a'"a"では帰ってくるものが異なる

printf("%d\n",65) /*整数値として表示*/
printf("%c\n",65) /*文字コードとして解釈*/
printf("%d\n",'A') /*整数値として表示*/
printf("%c\n",'A') /*文字コードとして解釈*/

文字列操作のライブラリ

#include<string.h>
char *strcpy(char *dst, const char *src);
/*文字列srcをdstにコピー*/
 
size_t strlen(const char *s)
/*NULL文字を含まない文字列の長さを返す*/
 
int strcmp(const char *s1, const char *2)
/*辞書順で比較してs1<s2なら負、s1==s2で0、s1>s2で正の値を返す*/

src: source
dst: destination

size_tはだいたいunsigned intであると考えてよいらしい(符号なし整数)

文字列の途中に\0を入れることで母児列を分割できる


データ構造

  • スタック
  • キュー
  • デク

同種のデータを複数保持するデータ構造

スタック

  • データを積み上げて保存するイメージ
  • 格納も取得も一番上に対してのみ行える
  • Last-In-First-Out(LIFO)
  • push,pop

キュー

  • データを待ち行列で保存するイメージ
  • 格納はtail、取得はheadに対してのみ行うことが可能
  • enqueue
  • dequeue

デク

  • キューとスタックの特性を併せ持つデータ構造
  • キューの先頭と末尾それぞれで格納と取得が可能

この辺の概念を具体的なプログラミング言語で実現(実装)
いろいろな仮定、エラー処理が必要になる

  • 空のスタックからpop
  • 満杯のキューにenqueue

など


スタックの実装

  • Cで実装
  • データ保持には配列を利用
  • 常にtopが必要なので構造体を用いて参照しやすくする
struct stack{
	int top;
	elemtype elem[SIZE];
}

配列の0をボトム、topは変数で管理する

void push(struct stack *s, elemtype val){
	s -> top++;
	s -> elem[s->top]=val;
}
elemtype pop(struct stack *s){
	elemtype val;
	val=s->elem[s->top];
	s->top--;
	return val;
}

理論通りではかなり短く書けるが、エラーに対処できるようにすると長くなる


文字列とポインタ