2.12.5. 文字列#

2.12.5.1. char 型#

C/C++ 言čĒžã§ã¯ã€1 æ–‡å­—ã‚’æ‰ąã†ãŸã‚ãĢ char 型をäŊŋį”¨ã—ãžã™ã€‚char 型ぎã‚ĩイã‚ēは 1 バイトとæąēめられãĻおり、1 つぎ変数ãĢは 1 文字しかæ ŧį´ã§ããžã›ã‚“ã€‚æŦĄãŽäž‹ã§ã¯ã€3 つぎ char 変数ãĢそれぞれ文字をäģŖå…Ĩし、ぞとめãĻå‡ē力しãĻいぞす。

#include <stdio.h>

int main(void) {
    char a = 'D';
    char b = 'N';
    char c = 'A';

    printf("%c%c%c\n", a, b, c);  // DNA
    
    return 0;
}

č¤‡æ•°ãŽæ–‡å­—ã‹ã‚‰ãĒã‚‹æ–‡å­—åˆ—ã‚’æ‰ąã†å ´åˆã¯ã€char åž‹ãŽé…åˆ—ã‚’åˆŠį”¨ã—ãžã™ã€‚ã“ãŽã¨ãã€æ–‡å­—åˆ—ãŽæœ€åžŒãĢはåŋ…ずヌãƒĢ文字 \0 をįŊŽãåŋ…čĻãŒã‚ã‚Šãžã™ã€‚ãƒ€ãƒ–ãƒĢクりãƒŧテãƒŧã‚ˇãƒ§ãƒŗã§æ–‡å­—åˆ—ã‚’æŒ‡åŽšã—ãŸå ´åˆã¯ã€ãƒŒãƒĢ文字がč‡Ēå‹•įš„ãĢčŋŊ加されぞす。

#include <stdio.h>

int main(void) {
    char str1[] = {'R', 'N', 'A', '\0'};
    printf("%s (%lu)\n", str1, sizeof(str1)); // RNA (4)

    char str2[] = "DNA";
    printf("%s (%lu)\n", str2, sizeof(str2)); // DNA (4)

    return 0;
}

2.12.5.2. char åž‹ãƒã‚¤ãƒŗã‚ŋãƒŧ#

文字列は、char 型ぎ配列だけでãĒく、char åž‹ãƒã‚¤ãƒŗã‚ŋãƒŧã§ã‚‚æ‰ąã†ã“ã¨ãŒã§ããžã™ã€‚æ–‡å­—åˆ—ãƒĒテナãƒĢã‚’æŒ‡ã™ãƒã‚¤ãƒŗã‚ŋãƒŧをäŊŋう場合、内厚を書き換えãĒいため const char* とするぎが一čˆŦįš„ã§ã™ã€‚

#include <stdio.h>

int main(void) {
    const char* str = "DNA";
    printf("%s\n", str);  // DNA
    return 0;
}

2.12.5.3. string 型#

C++ では std::string 型をäŊŋã†ã“ã¨ã§ã€æ–‡å­—åˆ—ã‚’ã‚ˆã‚ŠåŽ‰å…¨ã‹ã¤į°Ąå˜ãĢæ‰ąãˆãžã™ã€‚æ–‡å­—åˆ—ãŽįĩåˆã‚„é•ˇã•ãŽå–åž—ãĒãŠãŒį›´æ„Ÿįš„ãĢčĄŒãˆã‚‹į‚šãŒį‰šåž´ã§ã™ã€‚

#include <iostream>
#include <string>

int main() {
    std::string str1 = "DNA";
    std::string str2 = "RNA";

    std::cout << str1 + str2 << std::endl;  // DNARNA
    return 0;
}

char 型配列は、そぎぞぞ std::string ãĢæ¸Ąã™ã“ã¨ã§å¤‰æ›ã§ããžã™ã€‚é…åˆ—ãŽå ´åˆã¯ãƒŒãƒĢ文字ぞでがč‡Ēå‹•įš„ãĢ文字列としãĻæ‰ąã‚ã‚Œãžã™ã€‚

#include <iostream>
#include <string>

int main() {
    char arr[] = "CGTCAAACGG";
    std::string dna_seq(arr);

    std::cout << dna_seq << std::endl;  // CGTCAAACGG
    return 0;
}

char åž‹ãƒã‚¤ãƒŗã‚ŋãƒŧから変換する場合も同様ãĢ変換できぞす。

#include <iostream>
#include <string>

int main() {
    const char* ptr = "CGTCAAACGG";
    std::string dna_seq(ptr);

    std::cout << dna_seq << std::endl;
    return 0;
}

std::string では、文字列を配列と同じようãĢæ‰ąã†ã“ã¨ãŒã§ããžã™ã€‚äž‹ãˆã°ã€ã‚¤ãƒŗãƒ‡ãƒƒã‚¯ã‚šã‚’æŒ‡åŽšã—ãĻį‰šåŽšãŽæ–‡å­—ãĢã‚ĸクã‚ģ゚できぞす。

#include <iostream>
#include <string>

int main() {
    std::string seq = "CGTCAAACGG";
    std::cout << seq[0] << " " << seq[1] << std::endl;  // C G
    return 0;
}

æ–‡å­—åˆ—ãŽé•ˇã•ã¯ size() で取垗できぞす。

#include <iostream>
#include <string>

int main() {
    std::string seq = "CGTCAAACGG";
    std::cout << seq.size() << std::endl;  // 10
    return 0;
}

č¤‡æ•°ãŽæ–‡å­—åˆ—ã‚’é€Ŗįĩã™ã‚‹å ´åˆã¯ã€+ æŧ”įŽ—å­ã‚’äŊŋいぞす。

#include <iostream>
#include <string>

int main() {
    std::string mRNA = "CGTCAAACGC" + std::string("CGCCCGATAG") + "AACCAATTGT";
    std::cout << mRNA << std::endl;
    return 0;
}

æ–‡å­—åˆ—ä¸­ã‹ã‚‰į‰šåŽšãŽéƒ¨åˆ†æ–‡å­—åˆ—ã‚’æŽĸすãĢは、find ぞたは rfind をäŊŋį”¨ã—ãžã™ã€‚find は前から、rfind は垌ろから検į´ĸしぞす。čĻ‹ã¤ã‹ã‚‰ãĒい場合は std::string::npos がčŋ”されぞす。

#include <iostream>
#include <string>

int main() {
    std::string seq = "CGTATACAAACCGGAGCGAAAAC";

    auto pos1 = seq.find("AAA");
    auto pos2 = seq.rfind("AAA");

    std::cout << pos1 << std::endl;  // 7
    std::cout << pos2 << std::endl;  // 19
    return 0;
}

replace をäŊŋうと、指厚したäŊįŊŽã¨é•ˇã•ぎ文字列をåˆĨぎ文字列ãĢįŊŽãæ›ãˆã‚‰ã‚Œãžã™ã€‚

#include <iostream>
#include <string>

int main() {
    std::string seq = "CGTCAACGTAACCTGC";
    seq.replace(0, 3, "AAAAAAAAAA");

    std::cout << seq << std::endl;
    return 0;
}

į‰šåŽšãŽæ–‡å­—ã‚’ã™ãšãĻåˆĨぎ文字ãĢįŊŽãæ›ãˆãŸã„場合は、find と replace をįĩ„ãŋ合わせãĻå‡Ļį†ã—ãžã™ã€‚æŦĄãŽäž‹ã§ã¯ã€ã™ãšãĻぎ T を U ãĢįŊŽãæ›ãˆãĻいぞす。

#include <iostream>
#include <string>

int main() {
    std::string seq = "CGTCAACGTAACCTGC";

    for (auto pos = seq.find('T'); pos != std::string::npos; pos = seq.find('T', pos + 1)) {
        seq.replace(pos, 1, "U");
    }

    std::cout << seq << std::endl;  // CGUCAACGUAACCUGC
    return 0;
}