FAQ


  1. ダウンロードした実行可能プログラムはどのようにすれば実行できますか?

    ダウンロードしたサーバプログラムをdg_server,クライアントプログラムをdg_clientとする.
    まず,それらプログラムに実行権を与える.そのためには,chmodコマンドを用いて,
    % chmod 755 dg_server
    % chmod 755 dg_client
    と入力する.lsコマンドによりディレクトリの内容を表示させてみよう.
    % ls -l
    -rwxr-xr-x 1 matsumi user 7313 9月 16日 18:03 dg_client
    -rwxr-xr-x 1 matsumi user 7241 9月 16日 18:03 dg_server
    となっていれば,これらプログラムに実行権が与えられている.
    プログラムの実行は,まず,サーバプログラムを
    % ./dg_server
    と入力することにより実行し,次にクライアントプログラムを,
    % ./dg_client
    と入力することにより実行する.

  2. CTRL+Dの入力とは何ですか?また,CTRL+Dが入力されるとどうなりますか?

    キーボードからCTRL+Dを入力する(CtrlキーとDを同時に押す)とファイルの終わりを表すEOFが標準入力からプログラムに送られる.(ただし,ワークステーションルームのマシンでは,CAPS+Dを押すこと.)
    入力関数は,CTRL+Dを受け取ると,それぞれの関数に決められた戻り値を返す.
    例えば,関数scanf()はコードEOFを返す.従って,例えば,CTRL+Dの入力によりwhileループを抜けるようなプログラムは次のように書けばよい.

    while(1) {
         .....
         if(scanf("%s", key) == EOF) break; /* CTRL+Dの入力でbreak */
         .....
    }

    また,関数fgets()はNULLを返す.従って,同様のプログラムは次のようになる.

    while(1) {
         .....
         if(!fgets(key, MAXKEYLEN, stdin)) break; /* CTRL+Dの入力でbreak */
         .....
    }
  3. ある決められた文字(例:コンマ)で区切られた文字列から,トークン(例:コンマで区切られた部分文字列)を切り出すにはどうすればいいですか?

    文字関数strtok()が使える.例えば,文字列"abc,def,ghi,jkl,mno"から,"abc","def","ghi""jkl","mno"を切り出すには,次のようにすればよい.

    char str[] = "abc,def,ghi,jkl,mno";
    char* token;
    
    token = strtok(str, ",");
    do {
        tokenを用いた処理;
        .....
    } while(token = strtok(NULL, ",")); /* strtok()がNULLを返すまで繰り返し */

    詳細は,Cの参考書を参照のこと.

  4. 関数scanf()は空白を含む文字列を読み込めないのですか?

    scanf("%s", line)に対して,文字列"abc def ghi"を入力すると,lineには"abc"が代入され,"def ghi"はバッファに残ったままになる.fgets()は空白を含む文字列を読み込むのでfgets()を用いる方が簡単である.

  5. 電話番号のデータベースの初期設定を書き換え可能にするにはどうすればよいですか?  

    データベースの初期設定

        static char *db[] = {"amano-taro","0426-91-9418","ishida-jiro","0426-91-9872",
                             "ueda-saburo","0426-91-9265","ema-shiro","0426-91-7254",
                             "ooishi-goro","0426-91-9618",NULL};
      
    を次のように書き換えます.
        static char *db[11];
        for(i=0; i<=9; i++) db[i] = (char *)malloc(32);
        strcpy(db[0], "amano-taro"); strcpy(db[1], "0426-91-9418");
        strcpy(db[2], "ishida-jiro"); strcpy(db[3], "0426-91-9872");
        strcpy(db[4], "ueda-saburo"); strcpy(db[5], "0426-91-9265");
        strcpy(db[6], "ema-shiro"); strcpy(db[7], "0426-91-7254");
        strcpy(db[8], "ooishi-goro");  strcpy(db[9], "0426-91-9618");
        db[10] = NULL;
      

     
  6. サーバとクライアントを別々の学生用のマシンで実行するにはどうすればいいですか?  

    学生用のマシンをe408d133(150.37.192.133)とe408d201(150.37.192.201)とし,e408d133でサーバプログラムdg_serverを,e408d201でクライアントプログラムdg_clientを起動するとする.まず,e408d133でサーバプログラムを起動する.
    e408d133 % ./dg_server
    次にクライアントプログラムをe408d201で起動する.
    e408d201 % ./dg_client
    server host name?
    上のようにサーバホスト名を聞いてくるので,IPアドレス"150.37.192.133"を入力する.
    ただし,ファイアウォールの関係で,学生用マシン間でコネクションが張れるTCPポート番号は8000~8050のみである.

  7. プログラムにおいてscanf等で日本語の読み込みを行うにはどのようにすればよいですか?
    ~/home/.qt/qtrc
    ファイルを開いて,次の一行
    [XIMInputStyle=On The Spot]
    [XIMOnputStyle=Over The Spot]
    に変更して保存後,ターミナルを再起動する.