N88-BASIC、アセンブラ、Cでポインター (4回目)
2023/1/21(土)
N88-BASIC、アセンブラ、Cでポインター (4回目)
C言語にポインターが存在する意味が
文字列中のアルファベットの小文字を
大文字に変換するプログラムを作ることで
何となく分かるようにするシリーズです
今回はC(言語)で
普通に作ったプログラムの紹介です
プログラムと解説はコメント(/* … */)を見て下さい
blg~.zip中のptr004.cです
#include <stdio.h> /* printf等使用の為 */
void main(void) /* mainから実行 */
{
char a[256]; /* 255文字+終端'\0' */
int i; /* 変数の定義 */
printf("? ");
gets_s(a, 256); /* 文字列入力 */
printf("%s\n", a); /* 文字列表示 */
for (i = 0; a[i]; i++) /* a[i]!='\0'繰返し */
{
if ('a' <= a[i] && a[i] <= 'z')
{
a[i] -= 'a' - 'A';
}
}
printf("%s\n", a); /* 文字列表示 */
gets_s(a, 256); /* キー入力待ち */
}
gets_s(a, 256);
aに入力した文字列を最大256文字まで入れる
Cの文字列は文字の配列変数に入れます
最後は'\0'が入りますので上記256文字は
255文字までの文字列という意味です
これがエラーとなる場合は(多少動作は異なりますが)
scanf_s("%s", a, 256);
を使用して下さい
printf("%s\n", a);
"%s"の部分がaの文字列に置換わり
"\n"は改行の表示です
for (i = 0; a[i]; i++)
i = 0,1,2,…と、a[i]が'\0'つまり0になるまで
繰返します
i++はiを1増やします
a[i]が'a'~'z'のとき'a'-'Z'(0x20)を引き
'A'~'Z'に変換しています
Cでは0xで16進数を表します
Cでは使用する変数は型指定しておく必要があります
char:8bits整数(文字)、int:32bits整数、他に
long,long long,unsigned ~,float,doubleなど
があります
'a'はaのキャラクターコード(0x61)
'A'はAのキャラクターコード(0x41)
例
12abを入力したとすると
a[0],a[1],a[2],a[3],a[4]
'1' ,'2' ,'a' ,'b' ,'\0'
を順番に調べて
'a'~'z'ならキャラクターコードを0x20引いた
文字('A'~'Z')にする
a[i] -= 'a' - 'A';
a内の0から数えてi番目の文字から0x20('a'-'A')を引く
これを文字数回繰返す
結果は
12AB
になる
C、インラインアセンブラは、
Cコンパイラーなどを準備しておいて下さい
例、Microsoft Visual Studioなど
windowsのconsoleアプリは実行終了後
ウインドウが閉じてしまうので
最後にキー入力待ちを入れています
使用している入力関数は
Microsoft Visual Studio以外では
代替え関数に変更する必要があるかも
しれませんがご了承下さい
blg~.zip(ptr004.c)は
以下のリンクからダウンロードできます
N88-BASIC、アセンブラ、Cでポインター (4回目)
C言語にポインターが存在する意味が
文字列中のアルファベットの小文字を
大文字に変換するプログラムを作ることで
何となく分かるようにするシリーズです
今回はC(言語)で
普通に作ったプログラムの紹介です
プログラムと解説はコメント(/* … */)を見て下さい
blg~.zip中のptr004.cです
#include <stdio.h> /* printf等使用の為 */
void main(void) /* mainから実行 */
{
char a[256]; /* 255文字+終端'\0' */
int i; /* 変数の定義 */
printf("? ");
gets_s(a, 256); /* 文字列入力 */
printf("%s\n", a); /* 文字列表示 */
for (i = 0; a[i]; i++) /* a[i]!='\0'繰返し */
{
if ('a' <= a[i] && a[i] <= 'z')
{
a[i] -= 'a' - 'A';
}
}
printf("%s\n", a); /* 文字列表示 */
gets_s(a, 256); /* キー入力待ち */
}
gets_s(a, 256);
aに入力した文字列を最大256文字まで入れる
Cの文字列は文字の配列変数に入れます
最後は'\0'が入りますので上記256文字は
255文字までの文字列という意味です
これがエラーとなる場合は(多少動作は異なりますが)
scanf_s("%s", a, 256);
を使用して下さい
printf("%s\n", a);
"%s"の部分がaの文字列に置換わり
"\n"は改行の表示です
for (i = 0; a[i]; i++)
i = 0,1,2,…と、a[i]が'\0'つまり0になるまで
繰返します
i++はiを1増やします
a[i]が'a'~'z'のとき'a'-'Z'(0x20)を引き
'A'~'Z'に変換しています
Cでは0xで16進数を表します
Cでは使用する変数は型指定しておく必要があります
char:8bits整数(文字)、int:32bits整数、他に
long,long long,unsigned ~,float,doubleなど
があります
'a'はaのキャラクターコード(0x61)
'A'はAのキャラクターコード(0x41)
例
12abを入力したとすると
a[0],a[1],a[2],a[3],a[4]
'1' ,'2' ,'a' ,'b' ,'\0'
を順番に調べて
'a'~'z'ならキャラクターコードを0x20引いた
文字('A'~'Z')にする
a[i] -= 'a' - 'A';
a内の0から数えてi番目の文字から0x20('a'-'A')を引く
これを文字数回繰返す
結果は
12AB
になる
C、インラインアセンブラは、
Cコンパイラーなどを準備しておいて下さい
例、Microsoft Visual Studioなど
windowsのconsoleアプリは実行終了後
ウインドウが閉じてしまうので
最後にキー入力待ちを入れています
使用している入力関数は
Microsoft Visual Studio以外では
代替え関数に変更する必要があるかも
しれませんがご了承下さい
blg~.zip(ptr004.c)は
以下のリンクからダウンロードできます