授業/C言語基礎/文字列
をテンプレートにして作成
開始行:
これまで、文字列は、''ダブル・クォーテーション'' ''"'' で...
実は、文字列は文字を並べたデータ、つまり、文字の配列です。
*文字列はchar型の配列 [#c810dcf4]
文字列は、複数の文字を並べたものであり、char型の配列とし...
#geshi(c){{
char s[] = "ABC";
}}
*文字列を出力するときの変換指定子は %s [#xfe1b213]
printf関数で、変数に格納された文字列を出力するときは、変...
#geshi(c){{
char s[] = "ABC";
printf(">> %s\n", s);
}}
**演習1 [#df23bded]
プログラム1を作成し、実行結果を確認せよ。
*文字列の最後は \0 [#h8fee5c1]
実は、文字列の最後には、''ナル文字'' ''\0'' という文字(...
つまり、"ABC" という文字列は、文字 A、文字 B、文字 C、そ...
配列なので、sizeof演算子で配列全体のサイズと要素のサイズ...
また、ナル文字を文字として表示することはできませんが、文...
#geshi(c){{
char s[] = "ABC";
int i, len;
len = sizeof(s) / sizeof(s[0]);
for (i = 0; i < len; i++) {
printf("%d\n", s[i]);
}
}}
(len は配列 s の要素数です。文字列 s の長さではありませ...
このプログラムを実行すると、次のようになります。
#geshi(sh){{
luna% a.out
>> 4
64
65
66
0
}}
**演習2 [#yc6c8569]
プログラム2を作成し、実行結果を確認せよ。
*文字列は \0 まで [#gf028828]
文字列の最後はナル文字 \0 なので、文字列の途中に \0 を代...
#geshi(c){{
char s[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
s[7] = '\0';
printf(">> %s\n", s);
}}
このプログラムを実行すると、次のようになります。
#geshi(sh){{
luna% a.out
>> ABCDEFG
}}
配列 s の長さは最後のナル文字を含めて 27 ですが、文字列 s...
ですから、sizeof では文字列の長さを調べることはできません。
**演習3 [#vdb17c46]
プログラム3を作成し、実行結果を確認せよ。
*初期化のとき以外は文字列を直接代入できない [#g19b90d4]
上のプログラムのように、文字列を格納する変数を宣言すると...
#geshi(c){{
char s[4];
s = "ABC";
printf(">> %s\n", s);
}}
**演習3 [#k118b967]
プログラム4に作成し、コンパイル結果を確認せよ。
*文字を一つずつ代入して文字列を作る [#ka6f7a85]
文字列は文字の配列ですから、配列の要素を一つずつ代入する...
このとき、最後にナル文字を追加するのを忘れないようにしま...
#geshi(c){{
char s[4];
s[0] = 'A';
s[1] = 'B';
s[2] = 'C';
s[3] = '\0';
printf(">> %s\n", s);
}}
**演習5 [#y6ce54a1]
プログラム5を作成し、実行結果を確認せよ。
*文字列をキーボードから入力する [#i8e95dd0]
scanf関数を使って、文字列をキーボードから入力することがで...
変換指定子にはprintf関数と同じ ''%s'' を使いますが、代入...
#geshi(c){{
char s[8];
scanf("%s", s);
printf(">> %s\n", s);
}}
ただし、文字列の長さが入力された文字数より大きくないと(...
そこで、変換指定子に文字数を指定して、入力される文字列の...
#geshi(c){{
char s[8];
scanf("%7s", s);
printf(">> %s\n", s);
}}
文字数を指定すると、最後にナル文字 \0 を追加します。
ですから、文字数は、配列の長さより1小さい数以下でないとセ...
このプログラムを実行し、"1234567890"と入力すると、結果は...
#geshi(sh){{
luna% a.out
1234567890
>> 1234567
}}
8文字目はナル文字になるので、7文字しかないように見えます。
**演習6 [#h7812f77]
プログラム6を作成し、実行結果を確認せよ。
*文字列を引数とする関数を作る [#rd075a3c]
文字列は文字の配列なので、char型の配列を引数とする関数を...
配列を引数として関数を定義するとその要素数が無視されるの...
しかし、文字列の場合は、最後がナル文字 \0 であることがわ...
たとえば、文字列を引数として受け取るとその文字数を返す関...
#geshi(c){{
#include <stdio.h>
int strlen(char s[]) {
int i = 0;
while (s[i] != '\0') { i++; }
return i;
}
int main(void) {
char s[16];
int len;
printf("英単語を入力してください");
scanf("%15s", s);
len = strlen(s);
printf("%d文字\n", len);
return 0;
}
}}
**演習7 [#m52d9f52]
プログラム7を作成し、実行結果を確認せよ。
*文字列操作関数を使う(おまけ) [#p020e499]
C言語には、文字列を操作するための関数(''文字列操作関数''...
文字列操作関数を使うには、''string.h'' をインクルードしま...
#geshi(c){{
#include <string.h>
}}
文字列操作関数には、次のようなものが用意されています。
-文字列の''長さ''を調べる ''strlen関数''
-文字列を''コピー''(''代入'')する ''strcpy関数''
-文字列を指定された文字数だけ''コピー''(''代入''する) '...
-文字列を''連結''する ''strcat関数''
-文字列を指定された文字数だけ''連結''する ''strncat関数''
-文字列を''比較''する ''strcmp関数''
-文字列を指定された文字数だけ''比較''する ''strncmp関数''
詳しい使い方は、教科書8.3節に載っていますが、この授業の範...
#geshi(c){{
#include <stdio.h>
#include <string.h>
int main(void) {
char s[16] = "ABC";
char t[16];
int len;
len = strlen(s); // 文字列sの長さを調べる
printf(">> %d\n", len);
strcpy(t, s); // 文字列sを文字列tにコピー(代入)する
printf(">> %s\n", t);
strncpy(t, s, 2); // 文字列sを文字列tに先頭から最大2文...
printf(">> %s\n", t);
strcat(s, "DEF"); // 文字列sの後ろに文字列"DEF"を連結...
printf(">> %s\n", s);
strncat(s, "GHI", 2); // 文字列sの後ろに文字列"GHI"の...
printf(">> %s\n", s);
if (strcmp(s, "ABCDEFGH") == 0) { // 文字列sと文字列"AB...
printf(">> 同じ\n");
} else {
printf(">> 同じでない\n");
}
if (strcmp(s, "ABCXYZ", 3) == 0) { // 文字列sと文字列"A...
printf(">> 同じ\n");
} else {
printf(">> 同じでない\n");
}
return 0;
}
}}
*まとめ [#ab7ad576]
''文字列''は''文字の配列''、つまり、''char型の配列''です。
''文字列の最後''には''ナル文字 \0'' が付けられ、配列の途...
文字列を入出力するときの''変換指定子は %s'' です。
ただし、''scanf関数''で指定する''変数の前にアンパサンド &...
関数の中では配列の長さを調べることができないため、配列を...
*練習問題 [#p9fdaf65]
練習問題は[[こちら>/授業/C言語基礎/文字列/練習問題]]。
終了行:
これまで、文字列は、''ダブル・クォーテーション'' ''"'' で...
実は、文字列は文字を並べたデータ、つまり、文字の配列です。
*文字列はchar型の配列 [#c810dcf4]
文字列は、複数の文字を並べたものであり、char型の配列とし...
#geshi(c){{
char s[] = "ABC";
}}
*文字列を出力するときの変換指定子は %s [#xfe1b213]
printf関数で、変数に格納された文字列を出力するときは、変...
#geshi(c){{
char s[] = "ABC";
printf(">> %s\n", s);
}}
**演習1 [#df23bded]
プログラム1を作成し、実行結果を確認せよ。
*文字列の最後は \0 [#h8fee5c1]
実は、文字列の最後には、''ナル文字'' ''\0'' という文字(...
つまり、"ABC" という文字列は、文字 A、文字 B、文字 C、そ...
配列なので、sizeof演算子で配列全体のサイズと要素のサイズ...
また、ナル文字を文字として表示することはできませんが、文...
#geshi(c){{
char s[] = "ABC";
int i, len;
len = sizeof(s) / sizeof(s[0]);
for (i = 0; i < len; i++) {
printf("%d\n", s[i]);
}
}}
(len は配列 s の要素数です。文字列 s の長さではありませ...
このプログラムを実行すると、次のようになります。
#geshi(sh){{
luna% a.out
>> 4
64
65
66
0
}}
**演習2 [#yc6c8569]
プログラム2を作成し、実行結果を確認せよ。
*文字列は \0 まで [#gf028828]
文字列の最後はナル文字 \0 なので、文字列の途中に \0 を代...
#geshi(c){{
char s[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
s[7] = '\0';
printf(">> %s\n", s);
}}
このプログラムを実行すると、次のようになります。
#geshi(sh){{
luna% a.out
>> ABCDEFG
}}
配列 s の長さは最後のナル文字を含めて 27 ですが、文字列 s...
ですから、sizeof では文字列の長さを調べることはできません。
**演習3 [#vdb17c46]
プログラム3を作成し、実行結果を確認せよ。
*初期化のとき以外は文字列を直接代入できない [#g19b90d4]
上のプログラムのように、文字列を格納する変数を宣言すると...
#geshi(c){{
char s[4];
s = "ABC";
printf(">> %s\n", s);
}}
**演習3 [#k118b967]
プログラム4に作成し、コンパイル結果を確認せよ。
*文字を一つずつ代入して文字列を作る [#ka6f7a85]
文字列は文字の配列ですから、配列の要素を一つずつ代入する...
このとき、最後にナル文字を追加するのを忘れないようにしま...
#geshi(c){{
char s[4];
s[0] = 'A';
s[1] = 'B';
s[2] = 'C';
s[3] = '\0';
printf(">> %s\n", s);
}}
**演習5 [#y6ce54a1]
プログラム5を作成し、実行結果を確認せよ。
*文字列をキーボードから入力する [#i8e95dd0]
scanf関数を使って、文字列をキーボードから入力することがで...
変換指定子にはprintf関数と同じ ''%s'' を使いますが、代入...
#geshi(c){{
char s[8];
scanf("%s", s);
printf(">> %s\n", s);
}}
ただし、文字列の長さが入力された文字数より大きくないと(...
そこで、変換指定子に文字数を指定して、入力される文字列の...
#geshi(c){{
char s[8];
scanf("%7s", s);
printf(">> %s\n", s);
}}
文字数を指定すると、最後にナル文字 \0 を追加します。
ですから、文字数は、配列の長さより1小さい数以下でないとセ...
このプログラムを実行し、"1234567890"と入力すると、結果は...
#geshi(sh){{
luna% a.out
1234567890
>> 1234567
}}
8文字目はナル文字になるので、7文字しかないように見えます。
**演習6 [#h7812f77]
プログラム6を作成し、実行結果を確認せよ。
*文字列を引数とする関数を作る [#rd075a3c]
文字列は文字の配列なので、char型の配列を引数とする関数を...
配列を引数として関数を定義するとその要素数が無視されるの...
しかし、文字列の場合は、最後がナル文字 \0 であることがわ...
たとえば、文字列を引数として受け取るとその文字数を返す関...
#geshi(c){{
#include <stdio.h>
int strlen(char s[]) {
int i = 0;
while (s[i] != '\0') { i++; }
return i;
}
int main(void) {
char s[16];
int len;
printf("英単語を入力してください");
scanf("%15s", s);
len = strlen(s);
printf("%d文字\n", len);
return 0;
}
}}
**演習7 [#m52d9f52]
プログラム7を作成し、実行結果を確認せよ。
*文字列操作関数を使う(おまけ) [#p020e499]
C言語には、文字列を操作するための関数(''文字列操作関数''...
文字列操作関数を使うには、''string.h'' をインクルードしま...
#geshi(c){{
#include <string.h>
}}
文字列操作関数には、次のようなものが用意されています。
-文字列の''長さ''を調べる ''strlen関数''
-文字列を''コピー''(''代入'')する ''strcpy関数''
-文字列を指定された文字数だけ''コピー''(''代入''する) '...
-文字列を''連結''する ''strcat関数''
-文字列を指定された文字数だけ''連結''する ''strncat関数''
-文字列を''比較''する ''strcmp関数''
-文字列を指定された文字数だけ''比較''する ''strncmp関数''
詳しい使い方は、教科書8.3節に載っていますが、この授業の範...
#geshi(c){{
#include <stdio.h>
#include <string.h>
int main(void) {
char s[16] = "ABC";
char t[16];
int len;
len = strlen(s); // 文字列sの長さを調べる
printf(">> %d\n", len);
strcpy(t, s); // 文字列sを文字列tにコピー(代入)する
printf(">> %s\n", t);
strncpy(t, s, 2); // 文字列sを文字列tに先頭から最大2文...
printf(">> %s\n", t);
strcat(s, "DEF"); // 文字列sの後ろに文字列"DEF"を連結...
printf(">> %s\n", s);
strncat(s, "GHI", 2); // 文字列sの後ろに文字列"GHI"の...
printf(">> %s\n", s);
if (strcmp(s, "ABCDEFGH") == 0) { // 文字列sと文字列"AB...
printf(">> 同じ\n");
} else {
printf(">> 同じでない\n");
}
if (strcmp(s, "ABCXYZ", 3) == 0) { // 文字列sと文字列"A...
printf(">> 同じ\n");
} else {
printf(">> 同じでない\n");
}
return 0;
}
}}
*まとめ [#ab7ad576]
''文字列''は''文字の配列''、つまり、''char型の配列''です。
''文字列の最後''には''ナル文字 \0'' が付けられ、配列の途...
文字列を入出力するときの''変換指定子は %s'' です。
ただし、''scanf関数''で指定する''変数の前にアンパサンド &...
関数の中では配列の長さを調べることができないため、配列を...
*練習問題 [#p9fdaf65]
練習問題は[[こちら>/授業/C言語基礎/文字列/練習問題]]。
ページ名: