Paepoi » C and GLib Tips » C Tips
C Tips
# 最終更新日 2021.02.27
下記のコードは Windows では使えません。
下記のコードは Windows では使えません。
自作 readline
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
* prompt 引数を NULL か空文字にするとパイプから読み取る
* strnlen srtndup でセキュア、バッファ外へはアクセスしないはず
*/
char*
readline(char *prompt) {
char buf[1024];
if (prompt && strnlen(prompt, sizeof(prompt)) != 0)
printf("%s", prompt);
fgets(buf, sizeof(buf), stdin);
size_t len = strnlen(buf, sizeof(buf));
return strndup(buf, len - 1);
}
int
main (int argc, char const* argv[]) {
char *buf = readline("何か入力してください > ");
printf("入力されたのは「%s」です\n", buf );
free(buf);
return 0;
}
端末入力とパイプ入力で振り分け
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
char*
readline(char *prompt) {
char buf[1024];
if (prompt && strnlen(prompt, sizeof(prompt)) != 0)
printf("%s", prompt);
fgets(buf, sizeof(buf), stdin);
size_t len = strnlen(buf, sizeof(buf));
return strndup(buf, len - 1);
}
int
main (int argc, char* argv[]) {
char *line;
if (isatty(0)) {
line = readline("何か入力してください > ");
printf("stdin に %s が入力されました\n", line);
free(line);
} else {
line = readline(NULL);
printf("パイプから %s が送られました\n", line);
free(line);
}
return 0;
}
一行上に出力
#include <stdio.h>
#include <unistd.h>
/**
* \e[数値A で戻りたい行数の数値
* \e[0J でカーソル以降の行を削除
* e は 033 や x1B でもいい
*/
int
main (int argc, char* argv[]) {
char* strs[4] = {"いーち", "にー", "さーん", "だぁー!"};
int i;
printf("いくぞー\n");
for (i=0; i<4; i++) {
sleep(1);
printf("\e[1A\e[0J"); /* 移動 */
printf("%s\n", strs[i]);
}
return 0;
}
色分け表示
端末アプリの機能ですが printf で使えます。#include <stdio.h>
/**
* 参考
* http://7ujm.net/etc/esc.html
* \e[数値m にて指定
* e は上記と同じ
*/
int
main (int argc, char* argv[]) {
printf("\e[32m緑色おおおお\n");
printf("\e[31m赤色おおおお\n");
// 戻す
printf("\e[39m戻したぞおおおお\n");
return 0;
}
setlocale
#include <stdio.h>
#include <locale.h>
/**
* gcc, Clang では ja-JP.UTF-8 になるはず
*/
int
main (int argc, char *argv[]) {
char *locale;
locale = setlocale(LC_ALL, "");
printf("locale は[%s]です\n", locale);
return 0;
}
組み込みマクロ
#include <stdio.h>
int
main (int argc, char *argv[]) {
printf("ファイル名は[%s]です\n", __FILE__);
printf("現在[%d]行目を処理しています\n", __LINE__);
printf("ビルド日時は[%s %s]です\n", __DATE__, __TIME__);
printf("保存日時は[%s]です\n", __TIMESTAMP__);
if (__STDC__)
printf("ANSI C 準拠です\n");
return 0;
}
ls の実装例
#include <stdio.h>
#include <dirent.h>
int
main (int argc, char *argv[]) {
DIR *dir;
struct dirent *dp;
dir = opendir(".");
while ((dp = readdir (dir)) != NULL) {
if (dp->d_name[0] != '.' && dp->d_type == DT_REG)
printf("%s\n", dp->d_name);
}
return 0;
}
cat の実装例
#include <stdio.h>
int
main (int argc, char *argv[]) {
FILE *fp;
char buf[256];
fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("%s\n", "開けません");
return 1;
}
while (1) {
if (fgets(buf, sizeof(buf), fp) == NULL)
break;
printf("%s", buf);
}
printf("\n");
fclose(fp);
return 0;
}
シェルスクリプトの実行
#include <stdlib.h>
int
main (int argc, char *argv[]) {
/* オプションもパイプも使えます */
system("ps ax | grep bin");
return 0;
}
日付と日時
#include <stdio.h>
#include <time.h>
#include <locale.h>
int
main(int argc, char **argv) {
char s[256];
time_t temp;
struct tm *timeptr;
/* コレをしないと日本語にならない */
setlocale(LC_ALL, "");
temp = time(NULL);
timeptr = localtime(&temp);
strftime(s, sizeof(s), "現在 %c", timeptr);
printf("%s\n", s);
return 0;
}
Copyright(C) sasakima-nao All rights reserved 2002 --- 2025.