XC備忘録① 文字列操作

Cでは文字列変数がないので、ポインタというのを使う

C言語のポインタの概念は難しい、国語力が弱くてマジでやばい(^^;

昭和のマイコン少年の自分は特にパソコンの学校にも通ってない完全独学、最新の考え方どころか、お行儀のよいプログラミングの概念知識も持ち合わせていない

ただ昭和BASICとZ80アセンブラは身体で覚えたので、そのあたりの知識で解釈することにする。 

 

文字列…ポインタの宣言・定義は

char *TEXT1="X68000";

と書くのだが

C言語の文字列定義はアセンブラのワークエリア定義のようなものらしく

TEXT1:   DB "X68000",0

という意味な模様

Z80だとこれを

LD HL,TEXT1

と、レジスタにアドレスを代入して操作するけど、Cはラベルのまま使えます…ワークエリアのラベルがCで言うポインタ…なんだと思う…多分

 

で、アドレスに書かれた値の参照はアセンブラだと
LD    A,(TEXT1+n)

こんな感じで参照するが、C言語も同じで

a = TEXT1[n]

という表記になる。ちなみにこれはC言語の配列の書式に等しい

 

別の表現をすると

「ポインタは配列の格納されている領域の先頭アドレス」とも言える

 

 

それで本題の文字列操作

C言語ではBASICみたいに文字列をのほほんと操作できない

例えば

if a$=B$ then print "あたり"

みたいには書けない

そもそも文字列変数がないから、こういう書式はありえない

 

このあたりはアセンブラだと思った方が考えやすいかもしれない

アセンブラ的な考え方だと

文字列の比較は、ワークエリア同士の比較だ

ポインタを一個ずつ動かして、一文字ずつ判定していく処理を繰り返す

 

さすがにそんなことをしていられないので各種関数を利用することにする

 

で、とりあえず作ったもの

/*文字列操作のテスト
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void main(int argc,char *argv[]) {

    char *msg1="X68000";
    char *msg2="XVI";
    char *msg3="compact";
    char *msg4="";
    char *msg5="";
    int i,d;
    int len;

/* peint msg1~3
*/

    printf("msg1 = %s\n",msg1);
    printf("msg2 = %s\n",msg2);
    printf("msg3 = %s\n",msg3);
    printf("msg4,5 = NULL\n");

/* msg4 = msg1
    BASICでいう文字列の代入、ポインタではなく文字列自体のコピー
    strcpy()
*/
    printf("BASICでいう文字列の代入、ポインタではなく文字列自体のコピー\n");

    printf("msg1 = %s\n",msg1);
    printf("msg4 = %s\n",msg4);
    strcpy(msg4,msg1);
    printf("msg1 = %s\n",msg1);
    printf("msg4 = %s\n",msg4);

/*    if msg1 = msg4
    if msg1 = msg2
    文字列の比較
    strcmp(msg1,nsg4);
    ↑いわゆるBASICの文字列比較
    strcmpi(msg1,msg4));
    ↑大文字小文字は区別されない
    等しいときは0を返す
*/

    printf("文字列の比較、等しいときは0を返す\n");

    d = strcmp(msg1,msg4);
    printf("%d\n",d);
    printf("%d\n",strcmp(msg1,msg2));


/* len(msg)
    文字列の長さ
    strlen(msg1)
*/

    printf("文字列の長さ\n");

    len = strlen(msg1);
    printf("strlen(msg1) = %d\n",len);
    printf("strlen(msg2) = %d\n",strlen(msg2));

/* 文字列の足し算

    msg1 = mdg1 + msg2
    strcat(msg1,msg2);
  msg2も内容が壊れる?、msg2のポインタが一個進む?
*/

    printf("文字列の追加、加算\n");

    printf("msg1 = %s\n",msg1);
    printf("msg2 = %s\n",msg2);
    printf("msg1 + msg2 = %s\n",strcat(msg1,msg2));
    printf("msg1 = %s\n",msg1);
    printf("msg2 = %s\n",msg2);

    --msg2;
    printf("--msg2 = %s\n",msg2);

/*
    新しく領域確保…文字列コピーや同じ?
*/

    printf("新しく領域確保…文字列コピーと同じ?\n");

    msg5 = strdup(msg3);
    printf("msg5 = %s\n",msg5);

    printf("各ポインタの内容確認\n");

    printf("msg1 = %s\n",msg1);
    printf("msg2 = %s\n",msg2);
    printf("msg3 = %s\n",msg3);
    printf("msg4 = %s\n",msg4);
    printf("msg5 = %s\n",msg5);

/* end
        ↓エラー用exit
        exit(EXIT_FAILURE);
*/
    exit(EXIT_SUCCESS);

}