Memo

メモ > 技術 > プログラミング言語: C/C++ > C: メモ

■C: メモ
■入出力関数 以下のような関数がある gets や scanf といった、使用が推奨されない関数も残っているので注意 fgetc(f) ... バイト単位の入力 fputc(c, stdout) ... バイト単位の出力 getc(f) ... 意味は fgetc() と同じ。マクロとして実装されている putc(c, stdout) ... 意味は fputc() と同じ。マクロとして実装されている getchar() ... 意味は getc(stdin) と同じ。入力元が固定されている putchar(c) ... 意味は putc(c, stdout) と同じ。出力先が固定されている fgets ... 行単位の入力。ただし1行読んで止まったのかバッファいっぱいまで書き込んで止まったのか区別できないので、扱いには注意が必要 fputs ... 任意の文字列を出力。行を出力するとは限らない。fgets() と対になるような名前だが、効果は対ではない gets ... バッファオーバーフローの問題を起こす欠陥があるので使ってはならない puts ... 文字列を標準出力に出力し、その後 '\n' を出力する scanf ... バッファオーバーフローの問題を起こす可能性があるので推奨されない ■文字列を出力
printf("[ %s ]\n", argv[i]);
■入出力のプログラム例
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdlib.h> #include <stdio.h> #include <string.h> #include <stdbool.h> #include <ctype.h> bool isnumber(char *s) { bool flag = true; while (*s != '\0') { if (isdigit(*s) == 0 && *s != '.') { flag = false; break; } s++; } return flag; } int main() { char buffer[1024]; char name[64]; char price[64]; char tax[64]; double price_number; double tax_number; double result_number; /* 商品名を入力 */ printf("商品名を入力してください>\n"); while (true) { /* 標準入力から読み込む */ if (fgets(buffer, sizeof(buffer), stdin) == NULL) { fprintf(stderr, "エラーが発生しました。プログラムを終了します。\n"); exit(0); } else { /* 改行文字がなければバッファサイズを超えているとみなし、入力ストリームを空読みする */ if (strchr(buffer, '\n') == NULL) { while (getchar() != '\n'); } /* 改行文字があれば文字列の終わりとみなす */ else { buffer[strlen(buffer) - 1] = '\0'; } /* 文字サイズ確認 */ if ((int)strlen(buffer) > 64) { fprintf(stderr, "商品名は64バイト以下で入力してください>\n"); continue; } /* 入力 */ else if (sscanf(buffer, "%s", name) == EOF) { fprintf(stderr, "商品名を入力できませんでした>\n"); continue; } } break; } /* 価格を入力 */ printf("価格を入力してください>\n"); while (true) { if (fgets(buffer, sizeof(buffer), stdin) == NULL) { fprintf(stderr, "エラーが発生しました。プログラムを終了します。\n"); exit(0); } else { if (strchr(buffer, '\n') == NULL) { while (getchar() != '\n'); } else { buffer[strlen(buffer) - 1] = '\0'; } if ((int)strlen(buffer) > 8) { fprintf(stderr, "価格は8バイト以下で入力してください>\n"); continue; } else if (sscanf(buffer, "%s", price) == EOF) { fprintf(stderr, "価格を入力できませんでした>\n"); continue; } else if (isnumber(price) == false) { fprintf(stderr, "価格は数値で入力してください>\n"); continue; } } break; } /* 税率を入力 */ printf("税率を入力してください>\n"); while (true) { if (fgets(buffer, sizeof(buffer), stdin) == NULL) { fprintf(stderr, "エラーが発生しました。プログラムを終了します。\n"); exit(0); } else { if (strchr(buffer, '\n') == NULL) { while (getchar() != '\n'); } else { buffer[strlen(buffer) - 1] = '\0'; } if ((int)strlen(buffer) > 4) { fprintf(stderr, "税率は4バイト以下で入力してください>\n"); continue; } else if (sscanf(buffer, "%s", tax) == EOF) { fprintf(stderr, "税率を入力できませんでした>\n"); continue; } else if (isnumber(tax) == false) { fprintf(stderr, "税率は数値で入力してください>\n"); continue; } } break; } /* 計算 */ price_number = atof(price); tax_number = atof(tax); result_number = price_number + price_number * tax_number; /* 結果を表示 */ printf("商品名は「%s」です\n", name); printf("価格は「%s」です\n", price); printf("税率は「%s」です\n", tax); printf("税込価格は%.0f円です\n", result_number); return 0; }

Advertisement