授業/C言語基礎/文字列 のバックアップソース(No.2)

これまで、文字列は、''ダブル・クォーテーション'' ''"'' で囲まれたもので、printf関数またはscanf関数に渡すだけのものでした。

実は、文字列は、文字を集めて並べたデータです。

そこで、まずは文字について説明し、それから、文字列について説明します。


*文字はchar型の変数に格納する [#if83af1c]

文字を格納するための変数の型は''char型''です。
#geshi(c){{
  char c;
}}


*文字はシングル・クォーテーションで囲む [#if7f171b]

文字列はダブル・クォーテーションで囲みましたが、文字は''シングル・クォーテーション'' ''''' で囲みます。
#geshi(c){{
  char c = 'A';
}}


*文字を出力するときの変換指定子は %c [#u56ed64b]

printf関数で、変数に格納された文字を出力するときは、変換指定子を''%c''とします(プログラム1)。
#geshi(c){{
  char c = 'A';
  
  printf(">> %c\n", c);
}}

**演習1 [#df4b341c]
プログラム1を作成し、実行結果を確認せよ。


*エスケープ・シーケンスは1文字 [#g7b54906]

改行 \n、バックスラッシュ \\、ダブルクオーテーション \" などのエスケープ・シーケンスは、1文字として扱われます(プログラム2)。
#geshi(c){{
  char c = '\"';
  
  printf(">> %c", c);
}}

**演習2 [#x91abbdc]
プログラム2を作成し、実行結果を確認せよ。


*文字列はchar型の配列に格納する [#c810dcf4]

文字列は、複数の文字を並べたものであり、char型の配列として扱われます。
#geshi(c){{
  char s[] = "ABC";
}}



*文字列を出力するときの変換指定子は %s [#xfe1b213]

printf関数で、変数に格納された文字列を出力するときは、変換指定子を''%s''とします(プログラム3)。
#geshi(c){{
  char s[] = "ABC";
  
  printf(">> %s\n", s);
}}


**演習3 [#df23bded]
プログラム3を作成し、実行結果を確認せよ。




*文字列の最後は '\0' [#h8fee5c1]

実は、文字列の最後には、''ヌル文字'' ''\0'' という文字(エスケープ・シーケンス)があります。

つまり、"ABC"という文字列は、文字 'A'、文字 'B'、文字 'C'、そしてヌル文字 '\0' から成る長さ4の文字列です。

ヌル文字は表示して確認することはできませんが、if文で比較すると確認できます(プログラム4)。
#geshi(c){{
  char s[] = "ABC";

  if (s[3] == '\0') {
    printf("ヌル文字です\n");
  } else {
    printf("ヌル文字ではありません\n");
  }
}}


**演習4 [#yc6c8569]
プログラム4を作成し、実行結果を確認せよ。



*初期化のとき以外は文字列を直接代入できない [#g19b90d4]

上のプログラムのように、文字列を格納する変数を宣言すると同時に初期化するときには、変数に文字列を直接代入できますが、それ以外のときは文字列を直接代入することができません(プログラム5)。
#geshi(c){{
  char s[4];

  s = "ABC";

  printf(">> %s\n", s);
}}


**演習4 [#k118b967]
プログラム4をプログラム5に変更し、コンパイル結果を確認せよ。



*文字を一つずつ代入して文字列を作る [#ka6f7a85]

文字列は文字の配列ですから、配列の要素を一つずつ代入するように、文字を一つずつ代入することができます。
このとき、最後にヌル文字を追加するのを忘れないようにしましょう(プログラム6)。
#geshi(c){{
  char s[4];
  
  s[0] = 'A';
  s[1] = 'B';
  s[2] = 'C';
  s[3] = '\0';
  
  printf(">> %s\n", s);
}}


**演習6 [#y6ce54a1]
プログラム6を作成し、実行結果を確認せよ。



*文字列をキーボードから入力する [#i8e95dd0]

scanf関数を使って、文字列をキーボードから入力することができます。
変換指定子にはprintf関数と同じ ''%s'' を使いますが、代入される変数の前にアンパサンド ''&'' をつけません。
#geshi(c){{
  char s[8];
  
  scanf("%s", s);
  printf(">> %s\n", s);
}}

ただし、文字列の長さが入力された文字数より大きくないと(入力された文字数+1以上でないと)、セグメント・エラーになる可能性があります。
そこで、変換指定子に桁数を指定して、入力される文字列の長さを制限します(プログラム7)。
#geshi(c){{
  char s[8];
  
  scanf("%8s", s);
  printf(">> %s\n", s);
}}

このプログラムを実行し、"1234567890"と入力すると、結果は次のようになります。
#geshi(sh){{
luna% a.out
1234567890
>> 1234567
}}
8文字目はヌル文字になるので、7文字しかないように見えます。


**演習7 [#h7812f77]
プログラム7を作成し、実行結果を確認せよ。


*文字列操作関数を使うときはstring.hをインクルードする [#bdac3d43]

文字列を操作するための関数が用意されていて、string.hをインクルードすることで使えるようになります。
#geshi(c){{
#include <string.h>
}}



*文字列の長さを調べる strlen関数 [#v9364b05]

文字列の長さを調べるには、strlen関数を使います。

strlen関数は、文字列を引数として受け取り、その長さをint型で返します。
#geshi(c){{
#include <stdio.h>
#include <string.h>

int main(void){
  int len = strlen("ABC");

  printf("%d\n", len);

  return 0;
}
}}


*まとめ [#c3f02ca5]





*練習問題 [#ffd26ac1]
**問題1 [#v380e817]
長さ64の文字列sを宣言し、sをキーボードから入力すると、文字列sの長さを出力するプログラムを作成せよ。
ただし、strlen関数を用いてはならない。

**問題2 [#td1e479d]
長さ64の文字列s1, s2を宣言し、s1をキーボードから入力すると、s1をs2にコピーしてs2を出力するプログラムを作成せよ。
ただし、strcpy関数を用いてはならない。

**問題3 [#u04a144b]
長さ64の文字列sを宣言し、入力された文字列が"Hello"なら「こんにちは」と出力するプログラムを作成せよ。
ただし、strcmp関数を用いてはならない。
トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS