日々気になっていたプログラムの事-1
おそらくこれから突発的に何度か不定期あるシリーズです
https://twitter.com/strimuer213p/status/823854746498789376
↑
すべての始まりのツイートです
今から書くことはこのツイートのリプライから指摘をいただいた物を自分なりに調べてみました
-------1月27日----------------------------------------
Visual Studioのセキュリティ
VSにおいて古くセキュリティが弱い(Microsoftが奨励しない)関数には
毎回エラーメッセージが出る。(調べるとよくぶつかるのが標準ライブラリ関数で
あるscanf()。)
このエラーを防ぐ方法は二つある
1.MSではPOSIX仕様のセキュリティに強い関数を作成しており(scanf()であるならば
scanf_s())そちらを使う
・良い点
実際にセキュリティが高くなりプログラムを安全に取り扱える
・悪い点
これは Visual Studio特有のもので他のエディタ等では使えない
「CE(Compilation Error)」というエラー)
2.#define _CRT_SECURE_NO_WARNINGSで「奨励しない関数である」という警告を
除去する
除去する
・良い点
競プロを行う上では先頭のこの文章を消去するだけでVSでプログラムの動きを確
認しながら競プロで提出できる
・悪い点
セキュリティの脆弱性は一切解決されていない
まとめ
競プロを行う上では#define _CRT_SECURE_NO_WARNINGSを使う方が良さそう
しかし、開発などを手掛けるのであればセキュリティに強い関数を使うべきである。
/*すこし調べましたが文章や具体例はすべて僕なので間違いや不適切な表現はあります
//_CRT_SECURE_NO_WARNINGSってただの臭いものには蓋をするの原理だった
//んですね…
//んですね…
//適当に調べたというか自分の経験的に2種類しか思い浮かばなかったのですが他にあ
//りますか?
//あと間違いがあれば教えて頂けると嬉しいです
POSIX(ポシックスまたはポジックス)
ソフトウェアの開発を容易にすることを目的としてIEEEが策定したアプリケーションイン
ターフェイス規格である。
ファイルのオープン
2種類のファイルのオープンモード
・バイナリモード
・テキストモード
2つの違い
・バイナリモード
OS環境に依存しない
どんな環境でも1バイトも変更せずに取り扱える
・テキストモード
OS依存、いわゆる環境依存文字
例:改行\r\n
windowsにおいての読み込み
・バイナリモード
\r\n
・テキストモード
\n
/*同じファイルなのに違う文字で保存されてしまう*/
//参考文献
ディレクトリとパス
コンピューティングの分野で、階層型ファイルシステムを使用している場合にそのプロセス
が現在関連付けられている(現在の位置にある)ディレクトリの事である。windowsでは作
業フォルダともよばれることがある。
が現在関連付けられている(現在の位置にある)ディレクトリの事である。windowsでは作
業フォルダともよばれることがある。
パス
つまりディレクトリやファイルの住所などのような情報の事をパスと言う
絶対パス表記
/Ri_ma/C/wakaranai
ソリューション
問題を解決するためのコンピュータシステム
C言語の文字
またchar型がint型と比較するときchar型の値が自動的に同等のint型に変換される
(integral promotion)
(integral promotion)
/*int型は計算が一番早い型*/
//いくつか調べましたがshort int型の方が速い(単純にint=32ビット,short=16ビット)
//というのをいくつか見かけたので…
//「前置詞 int型」以外の型(char型やfloat型)と比べれば速いみたいです
integral promotion
int型よりrankの低い整数値型の値はすべての値が表現できるのであればint型に変換できる
典型的なビット長
型 ビット 最小範囲
char 8 -128~127
signed char 8 -128~127
unsigned char 8 0~255
short int 16 -32,768~-32,767
signed short int 16 -32,768~-32,767
unsigned short int 16 0~65,535
int 32(稀に16) -2,147,483,648~2,147,483,647
signed int 32(稀に16) -2,147,483,648~2,147,483,647
unsigned int 32(稀に16) 0~4,294,967,295
long int 32 -2,147,483,648~2,147,483,647
signed long int 32 -2,147,483,648~2,147,483,647
unsigned long int 32 0~4,294,967,295
float 32 小数精度6桁
double 64 小数精度10桁
long double 80 小数精度10桁
/*C言語の規格では*/
//char<=short<=int<=long<=longlong
//longlongはちょっとわかりませんでした…
//大きさを超える値を代入すると
//char ch=128 printf("%d",ch);→→-128
//char ch=129 printf("%d",ch);→→-127
//char ch=130 printf("%d",ch);→→-126
//範囲を超えると最小値からスタートする
//VS、wandboxも同じ結果
<stdint.h>
C言語の標準ヘッダ
指定の幅を持つ整数型を宣言し、それらの宣言に対応するマクロを定義します
例:
typedef==int8_t→signed char型
解釈
typedef==int32_t→int
解釈
sizeof演算子
sizeofに渡された型や変数のメモリサイズを調べる物
ストリーム
・バイトストリーム
バイトのシーケンスとしてファイルを扱う
プログラム内ではストリームはバイトシーケンス
・ワイドストリーム
柔軟なストリームは、エンコーディング規則の広い範囲を持つことができ
る汎用的なマルチバイト文字のシーケンスとしてファイルを扱います
/*ここらへんはMSDNを書き写しましたが具体的にストーリムとは何かからわかりません*/
//である…
YSRさんのまとめ
1.ビット演算→uint_ナントカ
2.unsignedなループ変数→size_t
3.64bitなど長い幅を必要とする変数→int64_t
4.その他基本的な整数→int
ビット演算
固定長のワードなどといった「ビットの塊」に対して各のビットすべてに対する論理演算を
いっぺんい行う演算操作である
ループ変数
for(i=0;i<10;i++){}
一般的にこのfor文においてiをループ変数という
/*白山風露さんの部分はまったく何も…*/
//とりあえずint型とchar型は注意
まとめ
今作られている計算機は数学的な整数を格納できないから場合によっていろんな整数型が必
要だから場合を問わず一気にintを使うのは現実の複雑さから逃げるということだけ恥であり役
に立たない
要だから場合を問わず一気にintを使うのは現実の複雑さから逃げるということだけ恥であり役
に立たない
/*今までint型,char型と参考書に書いてあることだけを無意識に書き写していたので耳が*/
//痛いですね…
独C9.2-2
独習Cの進捗状況
ここあさんにVSのコマンドラインの使い方教えてもらいました!
-------1月24日----------------------------------------
最重要
/*分からない関数などのネット検索*/
ここあさんにVSのコマンドラインの使い方教えてもらいました!
-------1月24日----------------------------------------
最重要
/*分からない関数などのネット検索*/
//man 関数名
//関数名 MSDN
//と検索するとわかりやすいサイトに誘導される
/*Visual Studioだとコマンドラインが複雑*/
//よくわかってないので飛ばしています…
でできましたよ~
/*分からない関数などのネット検索*/
//man 関数名
//関数名 MSDN
//と検索するとわかりやすいサイトに誘導される
/*Visual Studioだとコマンドラインが複雑*/
//よくわかってないので飛ばしています…
if判定式内での変数代入
if*1==EOF)
ただif判定式内でも変数代入できるという確認
ifの扱い
while文内でのif()はどんなに長かろうと1行とみなされる
例
while(*p)
if(fputc(*p++,fp)==EOF){
printf("ファイルを開くことができません");
exit(1);
}
/*いろいろ応用効きそう(?)*/
//ただ今は危ないのですべてに{}をつけていきます…
exit
<stdlib.h>必須!
使用時は毎回確認
一般的なファイルの扱い
/*読み込みようにmyfileを開く*/
if *2 == NULL) {
printf("ファイルを開くことができません\n");
exit(1);
}
/*典型パターン例*/
//if判定式中にFILEを指定する
//作業をする関数(ファイル,作業内容)
//がNULLの時(大抵操作が失敗するとNULLが返る)
//printfでエラーを報告し
//exitでプログラムを終了させる
プロジェクトのプロパティ > 構成プロパティ > デバッグ > コマンド引数
でできましたよ~
独C9.2-1
独習Cの進捗状況
-------1月22日----------------------------------------
fgetc()
・「ストリーム」が示すファイルから次のバイトを
unsigned char型の値として読み込み、int型の値として返す
・エラーが起こるとEOFを返す
・ファイルの終わりに到達したときもEOFを返す
・戻り値をchar型の変数に代入可能
fputc()
・「文字」の以下バイトを「ストリーム」に結びつけているフ
ァイルにunsign char型の値として書き込みます。
「文字」はint型と定義されていますが、単にchar型を渡して
も問題ありません。これは一般によくとられる手法です。
・成功すると書き込んだ文字を返し、エラーが発生するとEOFを返す
/*文字がchar型とかint型とかピント来ないイマイチわからない*/
exit()
・<stdlib.h>
・現在実行中のプログラムを終了させる
break;
・for,do,while,ループを一つ脱出する
独C9.2-1
独習Cの進捗状況
-------1月22日----------------------------------------
fgetc()
・「ストリーム」が示すファイルから次のバイトを
unsigned char型の値として読み込み、int型の値として返す
・エラーが起こるとEOFを返す
・ファイルの終わりに到達したときもEOFを返す
・戻り値をchar型の変数に代入可能
fputc()
・「文字」の以下バイトを「ストリーム」に結びつけているフ
ァイルにunsign char型の値として書き込みます。
「文字」はint型と定義されていますが、単にchar型を渡して
も問題ありません。これは一般によくとられる手法です。
・成功すると書き込んだ文字を返し、エラーが発生するとEOFを返す
/*文字がchar型とかint型とかピント来ないイマイチわからない*/
exit()
・<stdlib.h>
・現在実行中のプログラムを終了させる
break;
・for,do,while,ループを一つ脱出する
独9.1
独習Cの進捗状況
-------1月21日----------------------------------------
-------1月21日----------------------------------------
fopen
:VS仕様→fopen
↓
#define _CRT_SECURE_NO_WARNINGSでエラー非表示
必要ヘッダファイルは<stdio.h>
ファイルを開いてストリームと結びつける
開く操作によってファイルに結び付けられた構造体へポ
インタを返す
開く作業が失敗するとヌルポインタを返す
モード
編集の内容を表す(簡略自己解釈)
たくさんある。→独習C:P.246
例:
r:読み込み用にテキストファイルを開く
w:書き込み用にテキストファイルを開く
FILE型
サイズ、ファイルの現在位置、アクセスモードなど
ファイルに関する様々な情報を格納する構造体
構造体
1つの名前でアクセスすることのできる変数の集まり
NULL
<stdio.h>ではNULLというマクロがヌルポインタとして定
義されている
※ファイル操作ではポインタが深く結びついているため
ポインタを変更したり、それの指しているオブジェト
を変更すると幸せになれない
※有効なファイルが返されたかどうかは非常に重要なので戻
り値がNULLでないことを"必ず"確認してください
ファイルを開く正しい方法
例:
テキスト入力のためにmyfileという名前のファイルを開く
FILE *fp;
if*1==NULL){
printf("ファイルを開く際にエラーが発生しました\n");
exit(1);/*または自分で作成したエラーハンドラに置き換える*/
}
※ファイルの存在についてそれぞれのモードによって対応が
異なるのでチェックが必要
(ファイルが新規作成されたり、上書きされたりする)
fclose
必要ヘッダファイルは<stdio.h>
ファイルを閉じストリームをファイルから切り離す
「ストリーム」はfopen()で取得した有効なファイルでなけ
ればならない
成功すると0を返し、エラーが起きるとEOFを返す
バッファをフラッシュ
ファイルシステムの実装の多くは効率を上げるためにデ
ィスクへのデータの書き込みを1セクタずつ行う。その
ため出力されたデータは、まずバッファに蓄えられ、1
セクタ分のデータが溜まったところでバッファからディ
スクに物理的に書き込まれます。一般にこれを「バッフ
ァをフラッシュする」と言います。
注意:fclose()
fclose()には決して無効な引数を渡してはなりません。
無効な引数を渡すと、ファイルシステムが損傷を受け、
場合によってはデータを失って復旧できなくなることも
あります。
*1:fp=fopen("myfile","r"
独C8.0(8章の理解度チェック)
独習Cの進捗状況
-------1月18日----------------------------------------
-------1月18日----------------------------------------
配列
二次元配列の入力
int main(void) {
int i
char str[9][40];
for (i = 0; i < 9; i++) {
printf("名前を入力してください %d:",i+1);
scanf("%s", &str[i]);
}
・1次元の方だけを書けばよい
大小の比較
if (max < num[i]) {
max = num[i];
h = i;
}
if (str2[i] < min) {
min = num[i];
l = i;
}
・比較後の最大値・最小値の入れ替えを忘れない
switch文
switch(i){
case 1:
文1;
文2;
break;
case 2:
文1;
文2;
break;
default:
文1;
文2;
break;
}
二つの文字列の比較
strcmp(文字列1,文字列2);
<string.h>が必要
一致すると0を返す
scanf
%sを使うのが賢明でないのは最初のホワイトスペースで
文字列の読み込みが止まるため
素数判定の関数模範例
int prime(int i) {
int j;
for (j = 2; j <(i/2) ; j++) {
if (!(i%j)) {
return 0;
}
}
return 1;
}