日々気になっていたプログラムの事-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型と参考書に書いてあることだけを無意識に書き写していたので耳が*/
//痛いですね…