プログラミング言語 C

自由形*1 入力変換を実行する関数 getint を作成せよ。

  1. /* getint.c */
  2. #include
  3. #include /* 関数 isspace, isdigit に必要 */
  4. #define MAX 100
  5. int get_int(int *);
  6. int get_ch(void);
  7. void unget_ch(int);
  8. main()
  9. {
  10. int n, m = 0;
  11. int num[MAX];
  12. for (n = 0; n < MAX && get_int(&num[n]) != EOF; n++)
  13. ;
  14. while (m < n) {
  15. printf("%5d\n", num[m]);
  16. m++;
  17. }
  18. return 0;
  19. }
  20. int get_int(int *pn)
  21. {
  22. int c, sign; /* sign は正負記号 */
  23. while (isspace(c = get_ch()))
  24. ;
  25. /* 関数 isspace は c が space のとき真を返す */
  26. /* スペース (改行も) をスキップ */
  27. if (!isdigit(c) && c != '+' && c != '-') {
  28. unget_ch(c);
  29. return 0;
  30. }
  31. /* 関数 isdigit は c が '0'-'9' のとき真を返す */
  32. /* 入力が数字でないとき (!) 0 を返して終了 */
  33. sign = (c == '-') ? -1 : 1; /* 負の記号を記憶 */
  34. if (c == '+' || c == '-')
  35. c = get_ch();
  36. for (*pn = 0; isdigit(c); c = get_ch())
  37. *pn = 10 * *pn + (c - '0');
  38. *pn *= sign; /* *pn の正負を確定 */
  39. if (c != EOF)
  40. unget_ch(c);
  41. return c;
  42. /* ファイル終了時には EOF を、整数の入力時には正の値を返す */
  43. }
  44. char buf[MAX];
  45. int buf_pt = 0;
  46. int get_ch(void)
  47. {
  48. return (buf_pt > 0) ? buf[--buf_pt] : getchar();
  49. }
  50. void unget_ch(int c)
  51. {
  52. if (buf_pt >= MAX)
  53. printf("caution : buffer oversized\n");
  54. else
  55. buf[buf_pt++] = c;
  56. }

$./getint < random.txt
として実行してみると、最後に別のデータ?がくっついてくる . . . (数以外の文字列も うまく扱えないし)
あとで 直しても いっか。

(追記) 直しました。(05/10/19)

*1:スペースや改行でデータが区切られたファイル