ababup1192
5/11/2017 - 12:22 AM

string.c

#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;
}