lC言語 データの入力 '98. 5.14   /96.11. 5
l.お知らせ 内容 LINK FILE   HTML Win PC Unix MS-DOS C C++ Mfc Java 
.C言語_ 3 フォ-マットコ-ド 6 演算子 9 FOR  集合デ-タ  目的別
1 表示してみる 4 変数と定数 7 条件判断 10 WHIILE  ポインタ     
2 エスケ-プ コ-ド 5 デ-タ入力 8 分岐   未使用  関数   ★ 
文字列の入力  キー入力  コマンドライン  フォーマット指定入力 

文字列の入力
キーボードから文字列を入力するには、gets 関数を使います。
gets 関数も stdio.h の中に入っています。
SAMPLE1.c
#include<stdio.h>     /* stdio.h をインクルードします。OK */
void main()                /* 以下、処理の内容 */
{
  char buf[128];                    /* 配列を宣言します。*/
  printf("文字列を入力して下さい。"); /* メッセージを表示します。*/
  gets(buf);                           /* キーボードから入力します。*/
  printf("\n次の文が入力されました。\n"); /* メッセージを表示します。*/
  printf("%s\n",buf);                    /* 入力内容を表示します。*/
}



1キー入力

SAMPLE2.c
#include<stdio.h>     /* stdio.h をインクルードします。OK */
void main()                /* 以下、処理の内容 */
{
  char c;                    /* 変数を宣言します。*/
  printf("キーを入力して下さい。"); /* メッセージを表示します。*/
  c=getch( );                           /* キーボードから入力します。*/
  printf("\n入力された文字 = %c \n",c);  /* 入力内容を表示します。*/
}
getch() は、押されたキーのコードを返します。
getche() を使えば、押されたキーの文字を表示した後に、キーコードを返します。

キーが押されないときには、次の処理に移るには
上記の例は、キーが押されないと関数が終了しません。
キーが押されるまで 待ち続けます。
kbhit() を使えば、キーが押されているかどうか、調べることができます。
SAMPLE22.c
#include<stdio.h>     /* stdio.h をインクルードします。*/
void main()                /* 以下、処理の内容 */
{
  char c;                    /* 変数を宣言します。*/
  if( kbhit() )              /* キーが押されたときは、  */
  { c=getch( );              /* キーコードを入力します。*/
    printf("\n入力された文字 = %c \n",c); /* 入力内容を表示します。*/
  }
}
このプログラムを実行すると、キーを押す間もなく、直ちに終了します。
これは、while などの、ループ処理の中で使うと効果があります。



コマンドラインと環境変数のデータ

プログラムの起動時には、プログラム名と共にコマンドラインを指定できます。
main() 関数は、MS-DOS から呼出されるときに、コマンドラインなどの情報を、引数に受け取ることができます。

環境変数も引数に受け取ることができます。
環境変数は、グローバル変数を使って取り出すこともできます。

次の例は、line.exe というプログラムを作って、コマンドラインと環境変数を表示します。
コンパイル後に、
 line AAA BBB CCC
のように、コマンドラインを与えて起動します。
line.c
#include <stdio.h>      /* 関数 printf() を使うため。     */
#include <stdlib.h>     /* グローバル変数 environ を使うため。*/

void main(int argc, char* argv[ ], char* envp[ ])
{
  printf("コマンドライン数= %d 個\n",argc);
  if(argc < 2)          /*  コマンドラインなしのとき。     */
  {  printf("コマンドライン0= %s\n",argv[0]);
     fprintf(stderr,"コマンドラインは入力されませんでした。\n");
  }
  else                  /*  コマンドラインがあるとき。     */
  {  printf("コマンドライン0= %s\n",argv[0]);
     printf("コマンドライン1= %s\n",argv[1]);
     printf("コマンドライン2= %s\n",argv[2]);
     printf("コマンドライン3= %s\n\n",argv[3]);
  }
  printf("環境変数0= %s\n",*environ );
  printf("環境変数1= %s\n",*(environ+1) );
}
Argument : 議論 要旨  Charcter : 性格 文字  Vector : ベクトル
envp は、argv と同様に使用できます。
この例では、envp を使わないで、グローバル変数 environ を使っています。
※ 引数名は、自分で自由に変更できます。

コマンドラインの指定方法
コマンドラインは プログラム名の後に、スペースかタブで区切ってタイプします。
(例)  line AAA BBB CCC
" " か ' ' で囲むと、スペースが含まれていても 一個のコマンドラインに判断されます。
(例)  line "AAA BBB" CCC  一個めが AAA BBB、二個めが CCC
ワイルドカードを指定すると、合致するファイル名に変換されます。
(例)  line D:\A*.*  例えば一個めが A.txt、二個めが A2.exe

備考 : コマンドライン
MS-DOS ウインドウでは、DIR などのコマンド(命令)を入力できます。
その、コマンドを入力している行をコマンドラインといいます。

  line.exe などのプログラムも、それを実行するためには、コマンドラインからプログラム名をコマンドとして与えてやる必要があります。

  コマンドラインには、そのコマンドを実行するプログラムに与えるデータもいっしょに入力することができます。
コマンドラインからコマンドプログラムに与えるデータも、コマンドラインと呼ばれます。
  1. コマンドラインからコマンドとコマンドラインを入力すると、
  2. MS-DOS は、「コマンド」で指定されたプログラムを、ハードディスクからメモリに読み出します。
  3. MS-DOS は、メモリに展開されたプログラムの特定の部分に、「コマンドライン」のデータをコピーします。
  4. そのデータの位置(ポインタ)が、main 関数の引数(ここの例では argc と argv)に代入されます。
備考 : 環境変数
MS-DOS の動作環境を設定するための変数で、変数の 内容は文字列です。
[MS-DOS] のページにあるように、追加・削除・変更ができます。

主に、パソコンの起動時に AUTOEXEC.bat ファイルによって作られます。
例  PROMPT=$p$g  プロンプト(カーソル) の形を指定しています。
   PATH=C:\WINDOWS;C:\WINDOWS\COMMAND;  パスを指定しています。
パス : プログラムの実行時に、MS-DOS がファイルをさがすディレクトリ。
パスの設定をしてあれば、ファイル名を入力するだけで実行できます。
パスの設定がなければ、ディレクトリも入力する必要があります。

main() 関数の引数
引数に受け取るデータは、次のように作られます。
 
プログラムを起動すると、コマンドラインのデータが作られます。
 一番目のデータにはプログラム名が格納されます。
 二番めからには、コマンドラインが順番に格納されます。
ワイルドカードはファイル名に変換され、コマンドラインが数えられます。

次に、ポインタ配列が作られます。
コマンドラインデータのポインタが順番に格納されます。
環境変数についても、コマンドラインと同様のデータが作られます。

次に、
 1 コマンドライン数
 2 コマンドラインのポインタ配列 のポインタ
 3 環境変数のポインタ配列 のポインタ
の三つのデータが順番に格納されます。
main() 関数は、この三つのデータを 引数に受け取ることができます。
これらは三つ共、2バイトのデータです。

何個のデータを受け取るのかは、main() 関数の自由です。
引数の数だけ、データを受け取れます。
ただし、引数を四個以上にしても、有効なデータは三個だけです。

main() 関数は、引数の数が決まっていません。
そのために引数の型のチェックは行われません。
  void main(int x, int y, int z)  
このように書いても、正常にコンパイルされてしまいます。
このままでも、y と z を *(char**)y のようにキャストして使用はできますが。

引数の型
一番目の引数は コマンドラインの型ですから、int などの整数型にします。
二番目と三番目は、
char *y[] ...配列は y[]、そのポインタだから *y[]
または、
char **y ...配列名はポインタと同じだから *y、その中身がポインタだから **y
のように書きます。
この二つの y は全く同じ意味を持ち、使う場合の区別はありません。
※ 配列のポインタは、最下位次元の要素数の記述を省略できます。
 配列要素数が何個でも、ポインタは一個だからです。
 [] は、配列 のポインタであることを示すために書きます。
 参考 : 多次元配列の場合は、最下位次元の要素数のみ省略できます。
 ポインタを使って要素を指定するときに、高位次元数が必要です。



参考 : フォーマット指定入力
scanf 関数を使うと、文章と数のように、型の異なるデータを同時に入力できます。
複数のデータを入力する場合は、そのフォーマットコードをスペースで区切って書きます。
SAMPLE3.c
#include<stdio.h>		/* stdio.h をインクルードします。OK */
void main()			/* 以下、処理の内容。*/
{
  char buf[128];			/* 名前入力用 */
  int buf2,buf3;			/* 身長,体重入力用 */
  int N;				/* 返り値代入用 */

  printf("名前と身長Cm,体重Kgを半角スペースで区切って入力して下さい。");
  N=scanf("%s %d %d",&buf,&buf2,&buf3);			/* キーボードから入力します。*/
  printf("名前=%s  身長=%dCm 体重歳=%dKg\n",buf,buf2,buf3);	/* 入力内容を表示します。*/
  printf("%d 個のデータが正しく入力されました。\n",N);
}

複数のデータを入力する場合、個々のデータはスペースで区切るか、1個のデータを入力する毎に改行します。
scanf("%s %d %d",&buf,&buf2,&buf3); は、
scanf("%s\n%d\n%d\n",&buf,&buf2,&buf3); と書いても同じです。

but には、フォーマットコード %s 、つまり、文字列が入力されます。
buf2,buf3 には、フォーマットコード %d 、つまり、整数が入力されます。
N には、正しく入力されたデータの数が代入されます。
ABC 167 DEF と入力した場合は、データの型が合わないので、N=2 になります。
007 180 70 と入力した場合は、007が数値ではなく数字として入力されるので、N=3 になります。

個々のデータの入力にはパスワードを設定できます。
scanf("XYZ%s 000%d",buf,&buf2);
このようにした場合は、名前を入力する前に XYZ と入力する必要があり、年齢を入力する前には 000 と入力する必要があります。
XYZ と 000 を入力しないと、正しいデータは入力できません。


T

C言語 4 変数と定数 5 デ-タ入力 6 演算子
 
  mtoga@sannet.ne.jp   登録日 '96. 6.15
URL : http://www.page.sannet.ne.jp/mtoga/index.html