文字列を扱ってみましょう。
文字列はchar型の配列です。Windowsでは、シフトJISの文字列が入ります。
一般的な文字列
#include <stdio.h>
void main(void) {
unsigned char str[] = "abcde";
printf( str );
}
実行結果
abcde
strには、"abcde\0"が配列として代入されています。
サイズは6バイトです。最後のNULL文字も含まれてます。
文字列 別の書き方
このように書いても同じことです。
#include <stdio.h>
void main(void) {
unsigned char str[6];
str[0] = 'a';
str[1] = 'b';
str[2] = 'c';
str[3] = 'd';
str[4] = 'e';
str[5] = '\0';
printf( str );
}
実行結果
abcde
char str[6] と配列の要素を6としています。
それ以上の長さでも構いません。 初期化されないのでゴミが入っている可能性はあります。
少ない場合は最後のNULL文字がないのでどういう動きになるかは不明確です。
文字列の操作
文字列のコピー
標準関数
#include <stdio.h>
#include <string.h>
void main(void) {
unsigned char str1[] = "C言語は難しい";
unsigned char str2[128];
int cnt;
strcpy(str2, str1);
printf("str2 %s\n", str2 );
}
実行結果
C言語は難しい
str1 の文字列を str2 に標準関数を使ってコピーしています。
str1 のNULL文字が来るまでコピーしています。
それ以外の方法としていくつかあります。
while文 を使う
#include <stdio.h>
void main(void) {
unsigned char str1[] = "C言語は難しい";
unsigned char str2[128];
int cnt;
cnt = 0;
while( str1[cnt] != NULL ) {
str2[cnt] = str1[cnt];
cnt++;
}
str2[cnt] = NULL;
printf("str2 %s\n", str2);
}
実行結果
C言語は難しい
for文 を使う
#include <stdio.h>
void main(void) {
unsigned char str1[] = "C言語は難しい";
unsigned char str2[128];
int cnt;
for ( cnt = 0 ; str1[cnt] != NULL ; ++cnt )
str2[cnt] = str1[cnt];
str2[cnt] = NULL;
printf("str2 %s\n", str2);}
}
実行結果
C言語は難しい
文字列の長さ
#include <stdio.h>
#include <string.h>
void main(void) {
unsigned char str[] = "abcde";
printf("str length %d\n", strlen(str));
}
実行結果
str length 5
文字列操作には、長さを求める関数 strlen があります。
文字列からNULLが検出されるまでの長さを返します。
文字列の結合
#include <stdio.h>
#include <string.h>
void main(void) {
unsigned char str[128];
unsigned char str1[] = "abcde";
unsigned char str2[] = "ABCDE";
strcat(str, str1);
strcat(str, str2);
printf("%s\n", str);
}
実行結果
abcdeABCDE
2つの文字列を連結する場合に使用する関数です。
コピー元文字列のNULLが検出されるまでをコピーします。