#include <stdio.h>
// 文字列を扱うために必要なライブラリ
#include <string.h>
int main(){
// 「1」文字を扱う為の型
char c;
// 文字列の場合は文字の配列にする。
char str[256];
int i, len, cmp;
// 文字の場合は、「必ず」シングルクォートで
c = 'a';
// printfやscanfのフォーマット指定子は、%c
printf("%c\n", c);
printf("好きな文字を1文字入力してください: ");
scanf("%c", &c);
printf("%c\n", c);
printf("好きな文字列を入力してください: ");
// 文字列の場合は、%sを指定し、配列の先頭のアドレスを渡す必要がある。
// 配列の変数名(str)は、配列の先頭(&str[0])と同じ意味を持つ。
// &strこれは意味が違ってしまうので注意。
scanf("%s", str);
printf("%s\n", str);
// 配列はアドレスを格納する型(固定長のポインタ)なので、文字列の代入はできない。
// str = "foo";
// 正しい代入はこちら。
str[0] = 'f';
str[1] = 'o';
str[2] = 'o';
// 文字列の最後は、ヌル文字('\0')という特殊文字を入れて最後を知らせる。
str[3] = '\0';
printf("%s\n", str);
// これは非常に面倒なので、strcpy関数を使う。
// str = "abcdefg"; ← stcpyのイメージ
strcpy(str, "abcdefg");
printf("%s\n", str);
// 文字の長さ == 配列の大きさ ではない。最後はヌル文字があるので、そこまで回して調べる。
len = 0;
// とりあえずは、配列の長さ分回す。
for(i=0; i<256;i++){
if(str[i] == '\0'){
break;
}
}
len = i;
printf("len(%s)=%d\n", str, len);
// しかし、こんなループを毎回回すのはダルいので
// strlen関数を使う。環境によってintやlongになるので、コンパイルして試してみる。
printf("len(%s)=%ld\n", str, strlen(str));
// 代入と同様に、 文字列 == 文字列 の比較はできない。
// 1文字ずつループを回してチェックする。
// 一致フラグ
cmp = 0;
// 文字数が同じでなかったらそもそも比較失敗。
for(int i; i<len; i++){
// 本当は、違う文字列同士で比較。
if(str[i] != str[i]){
// 違う文字があったら1を入れる
cmp = 1;
break;
}
}
if(cmp == 0){
printf("一致!\n");
}else{
printf("不一致!\n");
}
// 実際はダルいので、strcmp関数を使う。さっきの比較より優秀。
// 一致する場合は、0を返す。
printf("%s == %s = %d\n", str, "abcdefg", strcmp(str, "abcdefg"));
// 先頭文字aは同じ、 2文字目 bとcを比べてbの方が辞書順で小さい このようなときは -1
printf("%s == %s = %d\n", str, "ac", strcmp(str, "ac"));
// 辞書順で、大きいときは1
printf("%s == %s = %d\n", str, "aa", strcmp(str, "aa"));
// 大体の基礎はこんなところ
// あとは、文字の配列であることを活かしていろいろやろう
// 偶数番目の文字だけだす。
for(i=0;i<strlen(str);i+=2){
// 細かく制御するときは1文字ずつ
printf("%c", str[i]);
}
printf("\n");
// 最後に演習問題 strを逆順("gfedcba")で出力してみよう。
return 0;
}