配列を使った文字列操作関数について

Posted コメントするカテゴリー: C

C言語に標準搭載されている文字列操作関数を検証してみる。

まず、文字列操作関数を使う場合には、これまでプログラムの先頭に必ず書いていた「#include 」という記述に加え、次のような記述をする。

#include <string.h>

文字列操作関数をいくつか試してみる。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
   
int main(void)
{
    //配列と変数を宣言
    char s[4] = "ABC";
    int len;
      
    //■文字数を取得する
    len = strlen(s);
  
    printf("文字列の長さは%fである\n", len); //結果「文字列の長さは0.000000である」
    printf("文字列の長さは%dである\n", len); //結果「文字列の長さは3である」
      
    //■文字列コピー
    char ss[6];
    strcpy(ss, "world");
    printf("文字列は%dです\n", ss); //結果「文字列は1245010です」と出てしまう。。。
    
    //■文字列連結
    char d[6] = "AAA";
    char e[]  = "de";
    
    printf("\n\n%s\n\n", strcat(d, e));
    
    //■文字列比較
    char g[] = "AAA";
    char h[] = "ABBD";
    
    int cc = strcmp(g, h);
    printf("\n\n%d\n\n", cc); //結果「-1」と表示される
    
    //■数値などを文字列に変換する
    char ss[40];
    sprintf(ss, "%f", 143.5);
    printf("変換した結果、%dです\n\n", ss); //結果「変換した結果、1638164です」と表示される(これは正しいのか)
    
    //■文字列を数値に変換する
    char sss[] = "340";
    int nnn = atoi(sss);
    printf("変換した結果、%dです\n\n", nnn); //結果「変換した結果、340です」 と表示される
    
    
    
    
    
    
}



strcpyした直後の値が「文字列は1245010です」と出てしまう現象がわからない。なぜだ。

↓。自己解決しました。printf内での出力指定方法が「%d」だった為です。
%sにすることで文字列として出力することを検証した。

    printf("文字列は%sです\n", ss); //結果「文字列はworldです」と出た

型に迷ってしまう場合は、一旦こちら(http://propanmode.net/blog/?p=208)を確認すること。
↑の記事はもっと加筆する。

文字列変換系関数の検証

数値などを文字列に変換する関数。
sprintf()

文字列を数値に変化する関数。実行するには「#include 」の読み込みが必要。←実際には記述しなくてもatoi関数は動作した。
atoi()

配列

Posted コメントするカテゴリー: C

配列は複数の同じ型の変数を1つにまとめたもの。

下記のように宣言して使う。

#include <stdio.h>
 
int main(void)
{
	//宣言する場合
	int a[4];

	//初期化と同時に値を代入する場合
	int a[4] = {1,2,3,4};

	//配列の宣言のほうの添字を省く場合、自動的に配列の数が決まる
	int a[] = {1,2,3,4};

	//それぞれの配列に個別に値を代入する方法
	int b[4];
	b[0] = 1;
	b[1] = 2;
	b[2] = 3;
	b[3] = 4;

	//配列の添字の範囲外の数字を使って配列に台に代入するとエラーになる
	//(はずだったが手元の環境ではエラーにならず、、、)
	b[9] = 4;
}

配列と文字列操作
文字列を格納する為には配列を使う(文字列配列)。
配列のひとつひとつに文字が入っているイメージとなる。

#include <stdio.h>
 
int main(void)
{
	//宣言
	char s[] = "ABCD";

	//次のように記述しても同じ意味になる(\0はNULL文字列を表す)
	char s[5] = {'A', 'B', 'C', 'D', '\0'};
	
	
	//配列の中のひとつひとつが文字列なので、指定文字だけを制御することも可能
	char s[4] = "ABCD";
	s[2] = 'Z';
	
	printf("%s", s); //ABZDと表示される
	
}

練習

#include <stdio.h>
 
int main(void)
{
	//宣言
	int i = 0;
	char s[] = "ABC";
	char b[4];

	printf("%sを逆にする\n", s);
	
	while (s[i] != '\0') {
		b[i] = s[2-i];
		i++;
	}
	b[3] = '\0'; //\0はNULL文字列
	printf("%s\n", b);
}

switch文

Posted コメントするカテゴリー: C

複数の条件を判断し、その条件に応じた処理をするには、switch文を使う。
switch文はcaseと呼ぶ条件から処理を分岐し、どの条件にも当てはまらない場合はdefaultの処理に進む。
各条件の最後にはbreak文を記述して選択した処理のみを実行する。

#include <stdio.h>

int main(void)
{
	char a;
	
	printf("番号を入力\n");
	a = getchar();
	
	switch(a){
		
	case '1':
		printf("おぉ!\n");
		break;
	
	case '2':
		printf("おおぉ!\n");
		break;
	
	case '3':
		printf("おおおぉ!\n");
		break;
	
	case '4':
		printf("おおおおぉ!\n");
		break;
	
	default:
		printf("ぬぬ!\n");
		
	}


}

while文

Posted コメントするカテゴリー: C

ある条件が成り立っている場合のみ、ループをする処理を書く。

#include <stdio.h>

int main(void)
{
	int i = 10;
	while (i >= 0) {
		printf("iは今%dです。\n", i);
		i--;
	}
}

上の例で言うと、「i >= 0」の条件が成り立っている間は、{}の中の処理が走ることになる。

for文との違いはカウンタがあるかないかが大きな違いとなる。
繰り返す回数がわからない場合に使うことが多い。

条件の真偽に関わらず、必ず一回処理を実行してから判定を行うループは「do while文」といい、次のように書く。

#include <stdio.h>

int main(void)
{
	int b = 10;
	do {
		printf("bは今%dです。\n", b);
		b--;
	} while (b >= 0);
}

ループを途中で中断するには、「break」を使い、処理を終わらせることができる。
次の例はループ途中の5回目の処理で終わらせる場合の書き方。

#include <stdio.h>

int main(void)
{
	int i = 10;
	
	while (i >= 0) {
		if (i == 5) {
			break;
		}
		printf("iは今%dです。\n", i);
		i--;
	}
}

ループ処理の途中で、その回の処理を中断し、次の回の処理の最初から実行させる方法は「continue」を使う。

#include <stdio.h>

int main(void)
{
	int i = 10;
	
	while (i >= 0) {
		
		printf("iは今%dです。(1つめの出力)\n", i);
		if (i == 5) {
			i--;
			continue;
		}
		
		printf("iは今%dです。(2つめの出力)\n", i);
		i--;
	}
}

for 文

Posted コメントするカテゴリー: C

同じことを指定の条件下で繰り返し実行する場合に使う

include <stdio.h>

int main(void) {
    
    int i;
    for (i=0; i<10; i++) {
        printf("iは今、%d回目です\n", i);

    }

}

ループは2重にループさせることができる。(2重ループ)

#include <stdio.h>

int main(void) {
    
    int i;
    int j;
    for (i=0; i<10; i++) {
        printf("iは今、%d回目です\n", i);
        for (j=0; j <=3; j++) {
            printf("jは今、%d回目です\n", j);
        }
    }
}

制御文 連続したif文

Posted コメントするカテゴリー: C

複数の条件を判別したい場合には、if文を組み合わせて判別できる。

下記の例は、条件の1番目が成立するか2番目が成立するか、それとも全てに当てはまらないか。の判別をすることができる。

#include <stdio.h>

int main(void)
{
	int a = 5;
	
	if (a%2 == 0) {
		printf("%dは2で割り切れます\n", a);
	} else if(a%3 == 0) {
		printf("%dは3で割り切れます\n", a);
	} else {
		printf("%dは2でも3でも割り切れません\n", a);
	}

}

制御文 if

Posted コメントするカテゴリー: C

条件によって処理を振り分ける。
条件は比較演算子や論理演算しを使って条件式を指定する。

下記はint型の変数aの中身が偶数か奇数かを判別して結果を出力する。

#include <stdio.h>

int main(void)
{
	int a = 5;
	
	if (a%2 == 0) {
		printf("%dは偶数\n", a);
	} else {
		printf("%dは奇数\n", a);
	}
}

演算の優先度

Posted コメントするカテゴリー: C

演算子にはそれぞれ優先度が設定されている。

()や->などの記号は優先的に処理されるが、もしも式の中で同じ順位の演算子が並んでいる場合は、右から処理するのか、左から処理するのかという順序も言語の仕様として決まっている。

優先順位     演算子
1            () [] . ->  ++(後置) --(後置)
2            ! ~ ++(前置) --(前置) + - &(ポインタ)  *(ポインタ)  sizeof
3            キャスト演算子
4            * / %
5            +  - 
6            <<   >> 
7            <  <=  >  >=
8            ==  !=
9            &(ビット積)
10           ~
11           |
12           &&
13           ||
14           ? : (三項演算子)
15           = += -= *= /= %= &= |= ~= <<= >>=
16           , (カンマ)

型の変換

Posted コメントするカテゴリー: C

整数どおしで計算をすると、結果は整数になる。

3 / 2 = 1

正確に小数点まで出力する場合は、実数表記にして、計算する。

3.0 / 2.0 = 1.5

整数の計算と、実数の計算で、結果が異なることを確認。

#include <stdio.h>
int main()
{
	printf("3 ÷ 2 = %d \n", 3/2);
	printf("3 ÷ 2 = %f \n", 3.0/2.0);
	printf("3 ÷ 2 = %f \n", 3.0/2);
	printf("3 ÷ 2 = %f \n", 3/2.0);
}

整数どうしの演算では、一番範囲の広い型に変換される。
例えば下記の結果は

short s = 536;
char c = 12;
int a = s + c;

答えは548となり、charの型は-128~127として扱われるが、short型として計算される。

■異なる制度の型どうしの代入

unsigned char c = 1000; //オーバーフローし、上位2ビットが処理されない為、1000にはならない。
unsigned char c = -3; //符号なしの変数に符号付きの値をいれても、符号が解釈されない。

ビット と バイト

Posted コメントするカテゴリー: C

■ビットとは
ビットとは「1」か「0」の値とする、情報の最小単位を言う。

■バイトとは
ビットが8個集まったもの(8バイト)を1バイトと言う。

バイトの単位は2の10乗ごとに単位が繰り上がる。

単位        意味
KB          1KB=1024バイト
MB          1MB=1024KB
GB          1GB=1024MB
TB          1TB=1024GB

n進数について

Posted コメントするカテゴリー: C

コンピュータの世界では、2進数や16進数という、10以外の数値で位が繰り上がる数字の数え方をする。

10進数と比較して、2進数と16進数の位は次のようになる。

2進数      10進数      16進数
0          0           0
1          1           1
10         2           2
11         3           3
100        4           4
101        5           5
110        6           6
111        7           7
1000       8           8
1001       9           9
1010       10          A
1011       11          B
1100       12          C
1101       13          D
1110       14          E
1111       15          F
10000      16          G

プログラムの中で数値を16進数で表記するには、数字の前に「0x」をつける。
printfの書式では、「%x」として表す。

論理演算子

Posted コメントするカテゴリー: C

複数の条件を組み合わせて、より複雑な条件を表すときに使う。

演算子     働き
&&         かつ
||         または
!          ではない

条件が2つある場合、それぞれの条件を同時に満たす場合を判断するには「&&」を使います。
また、それぞれの条件の関係性をはっきりさせたい場合は「()」かっこでくくります。

(例)aの値が40以上で、なおかつ、100未満の場合
(40 <= a) && (a < 100)

比較演算子

Posted コメントするカテゴリー: C

変数や数などを比較する演算子のことを言う。
条件式などで、処理を変える場合に使う。
比較した条件が成立した場合は「真」および「true」といい、
成立しない場合は「偽」および「false」という

演算子  働き
==      等しい
<       小なり
>       大なり
<=      以下
>=      以上
!=      等しくない

条件式はそれぞれ比較した後の値を持っていると考える。
条件が真の場合は「1」、偽の場合は「0」という値を持っている。

サンプルプログラムとして以下のようなプログラムを作成。

#include <stdio.h>

int main(){

	int a = 1;
	int b = 2;

	printf("a<b    %d\n", a<b);     //比較式(小なり)
	printf("a>b    %d\n", a>b);     //比較式(大なり)
	printf("a==b   %d\n", a == b);  //比較式
	printf("a=b    %d\n", (a = b)); //代入式

}

インクリメント・デクリメント

Posted コメントするカテゴリー: C

インクリメントは加算演算子と呼び次のように記載。
動作としては元にあった変数に対して、プラス1を行う。

a++;

デクリメントは減算演算子と呼び、次のように記載

動作としては元にあった変数に対して、マイナス1を行う。

a--;

次のプログラムを作成し、実行するとコンソール上には「2321」と表示される。

#include <stdio.h>
int main(){
	int a = 1;
	a++;
	printf("%d\n", a);
	a++;
	printf("%d\n", a);
	a--;
	printf("%d\n", a);
	a--;
	printf("%d\n", a);
}

a++と書く場合と++aと書く場合の違い
++aと書く場合は前置という。反対にa++と書く場合は後置という。

#include <stdio.h>
 
int main(){

    //後置の動き
    int b, a = 1;
    b = a++;
    printf("%d\n", b); //結果は1

    //前置の動き
    int b, a = 1;
    b = ++a;
    printf("%d\n", b); //結果は2
 
}

演算子

Posted コメントするカテゴリー: C

基本的な演算子

+  足す
-  引く
*  かける
/  割る
%  剰余
=  代入

例として、次のようなプログラムを作成し、実行。

#include <stdio.h>
int main(){
	printf("5+3=%d\n", 5 + 3);
	printf("5-3=%d\n", 5 - 3);
	printf("5*3=%d\n", 5 * 3);
	printf("5/3=%d\n", 5 / 3);
}

代入演算子

+=  足した値を代入
-=  引いた値を代入
*=  かけた値を代入
/=  割った値を代入
%=  余りを代入

例として、次のようなプログラムを作成し、実行。

#include <stdio.h>
int main(){
	int a = 45;
	a += 30;
	printf("45に30を足した値は%d\n", a);
	a -= 30;
	printf("45から30を引いた値は%d\n", a);
	a *= 30;
	printf("45に30をかけ合わせた値は%d\n", a);
	a /= 30;
	printf("45を30を割った値は%d\n", a);
	a %= 30;
	printf("45を30を割ったあまりは%d\n", a);
}

プログラム内の日本語の取り扱い

Posted コメントするカテゴリー: C

コンピュータ内で文字を取り扱う時には、ASCIIコードとして処理される。
ASCIIコードとは、英数字などを0~127の番号に対応させて管理している。

 

たとえば、「A」は65、「B」は66、「1」は49、「2」は50、などのように。

 

アルファベットと数字、記号を合わせても100種類程度なので、7ビットで表現される。
日本語は種類が多いので、シフトJISというコードを使う。
半角文字を表すのに1バイト、全角文字で2バイト、を表す。

 

1バイトは256種類の情報を表す。
2バイトは65536種類の情報を表す。

 

メール等に使われる日本語コードはJISコードと呼ぶ。
JISコードは1バイトのうちに7ビットを使い、はじめにシフトイン、終わりにシフトアウトという特殊なコードを用いて他のコードと区別している。

 

 

特殊文字について

Posted コメントするカテゴリー: C

「¥」マーク(半角)ではじまる文字列は特殊な動作を行う文字として使う。
「¥」マークで始まる2文字のことをエスケープシーケンスと呼ぶ。

コード    エスケープシーケンス    動き
0         \0                      null文字(NULL)
8         \b                      バックスペース(BS)
9         \t                      タブ(TAB)
10        \n                      改行(LF)
13        \r                      復帰(CR)

「¥」マーク自身を表す時には、「¥」を2個書く。

「’」シングルクォートを現すときにも「¥’」と書く。
「”」ダブルクォートを現すときにも「¥”」と書く。

printfについて

Posted コメントするカテゴリー: C

printf関数の書式を勉強します。

printf("%4d\n", 11);
printf("%04d\n", 11);

それぞれ結果は「 11」と「0011」になります。
%4dの4は桁数を表し、04dはゼロ埋めをすることを表します。

実数を表す%fは小数点前後の桁数を表す。

printf("%6.1f\n", 123.45);

上記は「123.5」と出力される

文字を表す。

char name[] = "test!!";
printf("%6s\n", name);

文字列

Posted コメントするカテゴリー: C

文字列とは、文字型の文字が集まったもの。
記述方法は以下のようになる。

char a[6];

文字列を初期化し、同時に代入する

char a[6] = "world!";

[]は1バイトを格納する文字数にあたる。
省略すると、自動的に文字数を決定する。

char a[] = "world!";

文字列に変数を代入する

#include <string.h>
char t[10];
strcpy_s(t, "world!!!!");

実際にvisual studio express2013の環境では「strcpy」を「strcpy_s」と書かないとwarning「error C4996: ‘strcpy’: This function or variable may be unsafe」が出てしまったので、コンパイルができなかった。
これは古い関数は使わずに、新しいstrcpy_s関数を使えという意味でした。(_sはセキュアな関数という意味も)

文字型

Posted コメントするカテゴリー: C

文字列について勉強します。

C言語での「文字」は半角で1文字を指し、この文字を格納する変数の型はcharになる。

charは「-128~127」までの整数が入る。

C言語は文字と文字コードを同等とみなす。

char a = 'A';

printf("%d\n", a); //文字コードとして表示される
printf("%c\n", a); //文字として表示される

//複数の文字はchar a には代入できない。
//原則的に代入できるのは1バイトのデータのみ。

ちなみに、char a = ‘A’;と宣言する時はシングルクォートにしないとエラーになりました。

数値型

Posted コメントするカテゴリー: C

ここでは整数型と実数型を勉強します。

前の記事「printf()の使い方」にも書きましたが、整数型と実数型は取り扱う数値が異なってきます。

%d は整数を10進数で表し、「-2 -1 0 1 2 ・・・」
%fは実数を表し、「プラス」「マイナス」「整数」「分数」「小数」「有理数」「ルート」「π」等の無理数

さらに詳しく整数型について掘り下げてみると整数型には次の種類のものがあります。

型名                入る値                              ビット数
int                 システムによる                      
unsigned int        システムによる                      
long                -2147483648~2147483647             32
unsigned long       0~4294967295                       32
short               -32768~32767                       16
unsigned short      0~65535                            16
char                -128~127                            8
unsigned char       0~256                               8

unsigned とは符号がないという意味になります。

実数型は以下になります。

型名               入る値                               ビット数
float              -3.4x(10の38乗)~3.4(10の38乗)       32
unsigned int       -1.7x(10の308乗)~3.4(10の308乗)     64

変数

Posted コメントするカテゴリー: C

基本中の基本。変数です。
変数は値を格納するひとつの箱のようなものです。

変数を使ってみます。

まずは変数の宣言をして、その後に代入をして使います。

int a;
int b;
a=2;
b=3;

宣言の書き方は1列に並べてまとめることもできます。

a = 2; b = 3;
int a, b;
int a=2; b=3;

のように。

printf()の使い方

Posted コメントするカテゴリー: C

printf関数について、勉強します。

hello worldを出力した時は、

printf("hello world");

とそのまま記述しましたが、printf関数については、書式を設定することもできます。

具体的には次のとおり。

printf("%d", 3);

前半の「%d」が書式になり、「3」がデータになります。

この場合出力結果は「3」になる。

 

%dの部分は書式といい、表示するデータによって使い分ける必要がある。

 

%d は整数を10進数で表し、「-2 -1 0 1 2 ・・・」

%fは実数を表し、「プラス」「マイナス」「整数」「分数」「小数」「有理数」「ルート」「π」等の無理数

%c文字

%s文字列

 

 

HelloWorld

Posted コメントするカテゴリー: C

どの言語を勉強する時にでも必ずでてくる存在。

Visual Stidio Express 2013上でHelloWorldを出力させてみました。
新規プロジェクトでWin32コンソールアプリケーションを選択し、ウィザードを完了。

初期状態でソースコードが自動生成されてしまうので、それを一旦全削除し、下記のコードを打ち込む。

#include

int main()
{
    printf("Hello world !! \n");
}

実行すると、コンソール上にHello worldが表示されます。

最初、参考にしている書籍がmainの前にintがなく、そのまま実行するとコンパイルエラーとなりましたが、エラーメッセージをよく読むとmainの型がどうのこうのと言っていたので、型を書いてやると実行できました。

C言語の学習環境を作る

Posted コメントするカテゴリー: C

C言語の基礎の基礎からはじめる為、間違っている箇所も多いかもしれません。

まずは開発環境を整える為、Microsoft Visual Studio Expressをインストールしました。
C++も書けるようですが、まずはC言語の勉強ということで、c用のソースを書いてコンパイルして動作させて覚えていこうと思います。

まずはVisual Studio Expressをダウンロード
http://www.microsoft.com/ja-jp/dev/express/

開発環境そのものは無料で手に入りますので、URLをたどってダウンロード→インストールまで。

■20140801追記
上記の統合開発環境(IDE)を使って学習をしていましたが、どうやら期間制限があるようでしたので、途中で使えなくなりました。

7月下旬からは↓のツールを使って検証を続けています。
学習用C言語開発環境 Ver 0.0.9.0
(http://9cguide.appspot.com/index.html)

上記のツールを開発していただいた作者様に感謝。

(いずれは、、、)コンパイル環境をいちから導入してセットアップできる方法を調べて把握します。
今はまだ文法を検証するほうに重点を置いています。

unity からサーバへ通信を行い、データを渡す方法

Posted コメントするカテゴリー: unity

unity側では以下のようなコードで値をサーバに送信できます。

■unity側

function Start()
{
	var url = "htt://xxxxxxxxxxxxxx.net/xxx.php";

	var wf : WWWForm = new WWWForm();
	wf.AddField("value_a", "1234");

	var gettext : WWW = new WWW(url, wwwForm);
	yield gettext;
	Debug.Log(gettext.text);
}

■サーバ側(こっちはphpでもperlでもrubyでもなんでもOKです)

<?php
	//unityから送信されてきたデータをテキストに書き出す
	$value = $_POST['value_a'];
	
	//あとはここで$value を好きなようにする

?>

シーンを切り替える方法

Posted コメントするカテゴリー: unity
Application.LoadLevel(シーン名);

もしくは

Application.LoadLevel(シーンインデックス番号);

と記述する。
ここでいうシーンインデックス番号は、ビルド設定時のダイアログに一覧表示される番号です。

今表示しているシーン名を取得したい場合には

Application.loadedLevelName

という記述をすると取得できます。