質問

  1. 全角文字の取り扱い
  2. ビット演算
  3. 入出力関数
  4. 演算子の優先順位
  5. C言語のソースコードの印刷

Q.プログラムは正しいのに、全角文字の処理ができないのはなぜ?

A.全角文字に使っている文字コードの体系は、eucコードを使ってください。

全角文字を扱うための文字コードには、大ざっぱにいえば、EUCコード、シフトJISコード(SJIS)、JISコード、Unicode(UTF-8, UTF-16)があります。C言語のプログラムを書くときは、EUCコードを使って下さい。

Q.プログラムファイルで使っている文字コード体系を調べる方法は?

A.emacs でファイルを開き、下の黒い行の左端を見てください。「E」と書いてあれば、「EUCコード」が使われています。

ウインドウズで作ったテキストファイルは、大抵の場合は、シフトJISです。演習室のemacsで開くと「S(DOS)」と表示されます。

また、Webページからカットペーストをすると、JISになっていることがあります。そのときは、「J」と表示されます。

Q.文字コード体系をEUCコードに変更する方法は?

A.2とおりの方法を説明します。

emacs を使う方法 C-x RETURN f」(コントロールキーを押しながらxを押し、コントロールキーから手を離して、リターンキーを押し、f を押す)と押すと、「Coding system for visited file(default nil):」とミニバッファに表示が出ます。そこで、「euc-jp-unix」と入力してリターンキーを押してください。

ちなみに「euc-jp-dos」などもあります。改行コードが、Unix系、Windows系、Mac系では異なるので、選択ができるようになっています。

nkf を使う方法 nkf は、ネットワーク用漢字コード変換フィルタです。詳しくは、「man nkf」により実行方法を調べて下さい。

大抵の場合は、「nkf -e < 変換元のファイル名 > 変換先のファイル名」で EUCコードに変換できます。


Q.8ビット目が1かどうかを調べる方法は?

A.ビット演算子の「&」を使って調べます。

8ビット目が1の数は、2進数では、1000 0000 です。16進数に直すと 0x80 です。10進数に直すと 128 です。変数 x の 8ビット目を調べるには、「x & 0x80」または「x & 128」とします。その結果が 0 ならば、8ビット目が0であり、0でないならば、8ビット目は1であることが判断できます。

  if( (c && 0x80) != 0 ){
    8ビット目が1のときの処理
  } else {
    8ビット目が1でないときの処理
  }

「==0」の判定も良いのですが,間違えて「=0」とすることがあるので,「!=0」を使うほうが無難.


Q.どんな種類の入出力関数があるのか?

A. コマンドライン上で「man fgets」や「man fputs」とすると、文字(characters)や文字列(strings)の入力や出力の関数が一覧できます。

1文字の入力は int fgetc(FILE *stream)、文字列の入力は char *fgets(char *s, int size, FILE *stream) を使います。FILE *stream という変数型のところに、「stdin」と書き込めば、標準入力からの入力になります。

ただし、char *gets(char *) 関数は使ってはいけません。

Q.メッセージの中に変数値を埋め込んで出力する方法は?

A.書式を指定して出力する関数「int fprintf(FILE *stream, char *format, ...)」があります。

標準出力からの出力ならば、int printf(char *format, ...) があります。

format は 書式のことです。出力したいメッセージと変数値を埋め込む個所を書きます。

標準出力やファイルへの出力ならば、fprintf を使いますが、文字列型の変数への出力ならば、「int snprintf(char *str, size_t size, char *format, ...)」が便利です。出力文字列の長さの上限が変数 size となっています。ちなみに、size_t は unsigned int のようです(整数値を使っていれば問題ありません)。

Q.フォーマットの書き方は?

A.メッセージの部分と変数の埋め込み部分があり、埋め込み部分は「%」で始まるラベルを使います。

変換指定の一覧
入力用(scanfなど) 出力用(printfなど)
文字 %c
文字列 %s
10進整数 %d または %i
10進正数 %u
16進整数 %x または %X
浮動小数点型
の実数
float型 %f %f
double型 %lf %f または %lf
指数型
の実数
float型 %e %e
double型 %le %e または %le

例:int a; printf("りんごの数は %d 個です。",a);

例:char *s; s = "abc"; printf("%c",s[1]); ⇒ 「b」だけが表示される。

例:double x; printf("半径を入力して下さい:"); scanf("%lf", &x);

scanf のときは変数のアドレスを引数に書くこと。

埋め込み部分の表示幅(文字数)を指定するには、「%」と「変換指定」の間に数値を書きます。(例:printf("%10d\n",123) ⇒ 「    123」、空白と123の3文字をあわせて10文字)

左よせして表示するには、表示幅の手前に「-」を書きます。(例:printf("%-10d\n",123) ⇒ 「123    」)


Q.演算子の優先順位はどうなっているの?

演算子の優先順位
演算子 名称
++
--
()
[]
->
.
後置インクリメント
後置デクリメント
関数引数
配列番号
構造体メンバの間接参照
構造体メンバ
++
--
!
~
-
+
&
*
sizeof
()
前置インクリメント
前置デクリメント
論理否定
1の補数
単項マイナス
単項プラス
アドレス
間接参照
サイズ
キャスト
*
/
%
乗算
除算
剰余
+
-
加算
減算
<<
>>
左シフト
右シフト
<
<=
>
>=
大小比較
== 等しい
!= 等しくない
& ビット演算の論理積(and)
^ ビット演算の排他的論理和(xor; eor)
| ビット演算の論理和(or)
&& 論理積(and)
|| 論理和(or)
?: 条件
= 代入
*=
/=
%=
+=
-=
<<=
>>=
&=
^=
|=
複合代入
, 式の区切り


Q.C言語のソースコードの印刷をかっこよくしたい

  1. ここのファイルをダウンロードしてください。(どっちか1つでok)
  2. 「tar -zxf tops120.tgz」 とするとtgz形式(tar.gz形式)の圧縮ファイルを展開します。
  3. 「toPS」というディレクトリができるので、移動する。
  4. README等のファイルを良く読み、コンパイルする。
  5. これでtoPSが完成です。
  6. 続いて、prt というディレクトリが toPS 内に有りますので、そこに移動してください。
  7. README等に従って作業をしてください。
  8. うまくいかなかったら徳久に聞いてください。

2004.4.23 by tokuhisa