Open15
【C言語】自分用チートシート
C言語を勉強するにあたり、よく使うけど覚えきれてない部分をメモしていくためのスクラップ。
完全自分用なので人に見せることは一切考えずに書いていく。
【変数の値を出力する】
printf("%d",i);
Rustの
println!("{}",i);
に慣れてるせいでだいぶ書きにくく感じた。
【標準入力を取得】
scanf("%d",&i);
【変換指定子】ってのがあるらしい。
%c 文字(char)
%s 文字列(char *)
%d 10進の整数(int, short)
%f 浮動小数点数(float)
%lf 倍精度浮動小数点数(double)
なるほどわからん。
【コメント】
//コメント
/* これも
コメント
*/
【標準入力の取得2】
char buf[100];
fgets(buf, sizeof(buf), stdin);
こっちのほうが良さそう?
Tips:改行が含まれないようにする
char buf[100];
fgets(buf, sizeof(buf), stdin);
char name [100];
sscanf(buf, "%s", name);
printf("Hello %s\n", name);
sscanfは書式に合わせてデータを取り出して別の変数に代入する。
(このとき余分なデータは代入されない。)
sscanfは文字列(stdin)から数値への変換もできる
char buf[100];
fgets(buf, sizeof(buf), stdin);
int number;
sscanf(buf, "%d", &number);
printf("%d\n", number);
sscanf関数の&が必要な理由については以下記事参照
【2つの文字列が同じかどうかを判定する】
#include <string.h>
if(strcmp(name, "hello") == 0) {
printf("hello");
}
strcmp
は2つの文字列を比較する。
2つの文字列が一致したら0になる。
【スペース区切りの文字を改行区切りにして出力】
入力は1000個
#include <stdio.h>
#include <string.h> // これ使う
int main(void){
char str[10000];
fgets(str, sizeof(str), stdin); // いつもの
char *tp;
tp = strtok(str, " ");
printf("%s\n", tp);
for(int i = 0; i<999; i++){
tp = strtok(NULL, " ");
printf("%s\n", tp);
}
}
Linux(ubuntu)からWindows向けのexeファイルを生成する
必要なもの
sudo apt install mingw-w64
32bit
i686-w64-mingw32-gcc main.c
64bit
x86_64-w64-mingw32-gcc main.c
N行の入力を、配列?に格納する
入力の形式
N
a_1
a_2
...
a_[n]
例
5
15
27
7
35
2
コード
#include <stdio.h>
#include <stdlib.h>
int main(void){
int n;
scanf("%d=",&n); //最初のNを取得
// 配列?の定義
int *a;
a = (int *)malloc(sizeof(int) * n);
// N行の入力を順番に取得
for (int i = 0; i < n; i++) scanf("%d",&a[i]);
//テスト
for (int i = 0; i < n; i++) printf("%d\n", a[i]);
free(a);
return 0;
}
上の入力例を入力した場合の出力
15
27
7
35
2
scanfとfgetsの違い
scanfは改行コードの直前まで取得する。fgetsは改行コードまで取得する。
scanfは入力文字数の取得ができるけどfgetsはできない。
scanfはバッファオーバーフローを起こす可能性がある。