Tips

C言語練習問題

C言語練習問題

環境について

C言語の練習問題です。

開発環境は以下の通り。コンパイラ、OSともに64bit環境である。

PC:MacBook Pro 2011early 15inch

OS:Windows 8.1(デュアルブート) 64bit版

メモリ:16GB(8GB x 2)

CPU:Core i7-2635QM 2.00GHz

コンパイラ:MinGW-w64 5.3.0 (posix, sjlj)

 

※問題文に書いてあるプログラムを実行する際は自己責任で実行してください。

※※各問題へのリンク一覧を作成しました。

問題

次のプログラムを作った。コンパイル、実行に関して以下の問いに答えよ。

 

プログラム(test41.c)

#include <stdio.h>

int main(void){
  char str[32] = "price : \012";
 
  printf("%s", str);
 
  return 0;
}

 

問1.次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。

A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の中の空欄を埋めよ。

なお、コマンドを入力する前はディレクトリ内のファイルはtest41.cのみであった。

gcc test41.c -o test41.exe -std=c99

 

選択肢A,B,C

A.コンパイルに成功して( 空欄1 )が生成される。

B.( 空欄1 )ためコンパイルエラーが起こる。

C.コマンドの( 空欄1 )の部分が間違っているためコンパイルが実行されない。

 

 

問2.その後、次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。 A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の空欄を埋めよ。

 test41

 

選択肢A,B,C

A.ファイルが実行され( 空欄1 )と画面に表示される。

B.( 空欄1 )というファイルがないため実行できない。

C.コンパイルはされているが、( 空欄1 )という問題があるため実行は危険である。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

解答

問1

A.コンパイルに成功して( test41.exe )が生成される。

 

問2

A.ファイルが実行され( price : )と画面に表示される。

 

解説
問1,問2

今回は値段を画面に表示するプログラムを想定したプログラムである。説明の便宜上、半角円マーク記号が必要な部分は全角円マーク¥で代用する。

日本語では半角円マークと半角バックスラッシュが同じ文字コードに割り当てられていることも多い。\は文字列中ではエスケープ文字になる。

そのため、¥012は¥012とは表示されずに、\0(ヌル文字)と12と解釈される。\0は文字列の終端を示すヌル文字の役割を果たす。そのため、\0の手前までしか表示されない。

 

なお、C言語の関数にはヌル文字の扱いが原因で脆弱性につながる挙動をするものもある。文字列を扱うプログラムを作成する場合はヌル文字が入っている文字列に対する挙動には十分に気を付けること。

 

正しく動かしたい場合、\をエスケープして\\として\が表示されるようにすればよい。プログラムは以下の通り。

※ただし、プログラムとしては動くが、「¥012」という表示は少々違和感がある。仕様を確認し、必要に応じて¥012ではなく¥12にするような処理などを加える必要がある。なお、その部分は問題本編とは関係ないので省略する。

 

プログラム(test41_1.c)

#include <stdio.h>

int main(void){
  char str[32] = "price : \\012"; //ここでエスケープしている。
 
  printf("%s", str);
 
  return 0;
}

 

実行結果

>gcc test41_1.c -o test41_1.exe -std=c99
>test41_1.exe
price : \012

 

 

 

他の問題へのリンク一覧はこちら

 

実践力が身につくC言語講座 連載リンク

競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載

アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載

パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載

Recent News

Recent Tips

Tag Search