C言語では文字列の複写、連結、比較等はすべて関数で行う。その際、
#include<string.h>
が必要となる。
文字列処理関数
strcpy(ss, st) 文字列ssにstをコピーする strcat(ss, st) 文字列ssの後ろにstを連結する strcmp(st1, st2) 文字列st1とst2を比較する
文字数によらず、文字の大小関係で結果が決まる st1 > st2なら戻り値は正の数
st1 < st2なら戻り値は負の数 st1=st2なら戻り値は0
strlen(st) 文字列の長さを返す
strncpy(ss, st, n) 文字列ssにstの先頭からn文字をコピーする strncat(ss, st, n) 文字列ssの後ろにstの先頭からn文字を結合する strcmp(st1, st2, n) 文字列st1とst2の先頭からn文字を比較する
☆ strcmp(ss, st)の動作については以下の例 14.7 で説明する。
これらの関数は戻り値が有る関数と、(見た目上)無い関数がある。
例えば、strcpy(ss,st)やstrcat(ss,st)は戻り値が無く、strcmp(st1,st2)やstrlen(st) は戻り値が有る。使用例としては、以下のようになる。
例 14.6. 文字列処理関数の例 1 #include<stdio.h>
2 #include<string.h>
3 void main(void){
4 char a[]="abc";
5 char b[]="def";
6 printf("文字列Y="%sY="の長さは%dです。Y=n", a, strlen(a));
7 strcpy(a,b);
8 printf("文字列Y="%sY="の長さは%dです。Y=n", a, strlen(a));
9 strcat(a,b);
10 printf("文字列Y="%sY="の長さは%dです。Y=n", a, strlen(a));
11 }
実行結果
文字列"abc"の長さは3です。
文字列"def"の長さは3です。
文字列"defdef"の長さは6です。
例 14.7. strcmpの実行例(ただし、処理系により値は異なる) 1 #include<stdio.h>
2 #include<string.h>
3 int main(void){
4 printf("1) %dY=n", strcmp("ABC","ABC"));
5 printf("2) %dY=n", strcmp("ABC","ABD"));
6 printf("3) %dY=n", strcmp("ABC","AAAA"));
7 printf("4) %dY=n", strcmp("ABC","AB"));
8 printf("5) %dY=n", strcmp("AB","CC"));
9 printf("6) %dY=n", strcmp("AB","ab"));
10 return 0;
11 }
実行結果
1) 0 2) -1 3) 1 4) 67 5) -2 6) -32
(考え方) 先頭から比較し、異なるところで比較した差を返す。その時の、各文字の値は
A B C D E F . . . Z a b c d e . . . z
65 66 67 68 69 70 . . . 90 97 98 99 100 101 . . . 122 である。
1) 2つの文字列が完全に一致している場合、strcmp()の値は 0 となる。
2) 先頭から比べていき、初めて異なる文字”C” と”D” の差-1 を返している。
4) ”AB”までは同じで、一方は”C”で他方は””なので、”C”の数67 を返している。
6) ”A”と”a”の差、-32を返している。
♠ 補足 strncpy(ss,st+k,n); 文字列ssにstのk番(k+ 1文字目)からn文字をコピー 例 strncpy(ss,st+3,5);
stの3番(0,1,2,3なので文字では4文字目)から5文字をssにコピーする。
すなわちa[]が
"abcdefghijklmn"
のとき、strncpy(b,a+3,5);とするとb[]は
"defgh"
となる。
計算機とアルゴリズムI
15 実習 VII
15.1 まとめの課題
課題 15.1. 標準入力から文字列を入力し、先頭文字にドット(.)が入力されるまで、入力された
文字列の長さを表示させるプログラムを答えよ。ただし、文字列の長さは最大20文字とする。
入力、実行の結果
b38khuR ←入力
入力された文字列は7文字です。
GH3AGa-2435R ←入力
入力された文字列は12文字です。
.bye ←入力
入力を終了します。
課題 15.2. 標準入力から西暦と月日を入力し、その年の何日目か表示するプログラムを作成
せよ。
入力、実行の結果
西暦を入力してください : 2000 何月ですか : 3
何日ですか : 1
2000年 3月 1日は2000年の61日目です。
課題 15.3. 標準入力から自然数(2〜10)を1つ入力し、その数のべき乗で1000に一番近いべき 乗を表示するプログラムを作成せよ。
入力、実行の結果(1)
自然数(2〜10)を入力してください : 2
2のべき乗で1000に一番近いのは 1024 です。
入力、実行の結果(2)
自然数(2〜50)を入力してください : 7 7のべき乗で1000に一番近いのは 343 です。
課題 15.4. 標準入力から文字列を入力し、辞書式に並べ替えて表示するプログラムを作成せよ。
ただし、数字はアルファベットより先に、アルファベットの大文字小文字は、大文字の後に小 文字が並ぶようにすること。また、記号は入力順を残して後ろに持ってくること。
入力、実行の結果
文字列を入力してください : AthLb+h430gaE153g*ok-Ovm
辞書式に並び変えた文字列は 013345AabEgghhkLmOotv+*- です。