Open15

【C言語】自分用チートシート

くまさんくまさん

C言語を勉強するにあたり、よく使うけど覚えきれてない部分をメモしていくためのスクラップ。
完全自分用なので人に見せることは一切考えずに書いていく。

くまさんくまさん

【変数の値を出力する】

printf("%d",i);

Rustの

println!("{}",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関数の&が必要な理由については以下記事参照
https://9cguide.appspot.com/15-03.html

くまさんくまさん

【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);
    }
}

参考:https://paiza.jp/works/c/primer/beginner-c4/23409

くまさんくまさん

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はバッファオーバーフローを起こす可能性がある。