[c言語] さっと復習(13) 文字列

c言語では、配列のサイズを超えて文字列が入力されるような状況でも、基本的にコンパイルエラーは起きないので注意する。

文字列操作

 string.h

文字列の操作に関する型や関数のヘッダーファイル。

#include <stdio.h>
#include <string.h>

int main(void) {
    char str_1[256];
    char str_2[256];
    char str_3[512];
    unsigned long len;
    
    printf("str_1:");
    scanf("%s", str_1);
    printf("str_2:");
    scanf("%s", str_2);

    // コピー
    printf("copy str_1 to str_3...\n");
    strcpy(str_3, str_1);
    printf("str_3: %s\n", str_3);
    // 結合
    printf("concatinate str_3 and str_2...\n");
    strcat(str_3, str_2);
    printf("str_3: %s\n", str_3);
    // 文字数
    len = strlen(str_3);
    printf("length of str_3: %lu\n", len);

    // 文字列の比較
    if (strcmp(str_1, str_2) == 0) {
        printf("str_1 is equal to str_2.\n");
    } else {
        printf("str_1 is not equal to str_2.\n");
    }

    return 0;
}

c言語では、文字列を比較するとポインタの比較になるので、例えば == で同じ文字列かどうかの比較はできない。strcmp 関数を使う。

文字列と数値

atoi atofaascii

sprintf(s, format, a) は、aformatの書式文字列に従って、s が指す文字配列へ書き込む。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char s1[256] = "12345";
    char s2[256] = "1.23456789";
    int num1;
    double num2;

    // 文字列を数値に変換
    num1 = atoi(s1);
    num2 = atof(s2);

    printf("s1:%s num1:%d\n", s1, num1);
    printf("s2:%s num2:%lf\n", s2, num2);

    puts("bring num1 to s2 and num2 to s1...");
    // 数値を文字列に変換
    sprintf(s2, "%d", num1);
    sprintf(s1, "%lf", num2);

    printf("s1:%s num1:%d\n", s1, num1);
    printf("s2:%s num2:%lf\n", s2, num2);

    return 0;
}