歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 不使用man 3 printf的函數,實現一個簡單的printf函數

不使用man 3 printf的函數,實現一個簡單的printf函數

日期:2017/3/1 10:10:19   编辑:Linux編程

題目:不使用man printf中的函數,實現一個簡易的輸出函數myprintf。

函數聲明:int myprintf(const char *format,...);

要求該函數可以識別(只需要識別)出format字符串中的%ld,%lf,%c,%s這四個轉義字符,並轉化成相應的參數。

說明:man printf中的函數即:printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf

實現代碼:

  1. #include <stdio.h>
  2. #include <stdarg.h>
  3. #include <stdlib.h>
  4. //輸出一段普通的字符串
  5. int PrintStr(const char *format)
  6. {
  7. const char *pos = format;
  8. int len = 0;
  9. while( *pos )
  10. {
  11. putchar( (int)*(pos++) );
  12. len++;
  13. }
  14. return len;
  15. }
  16. int MyPrintf(const char *format, ...)
  17. {
  18. const char *pos = format;
  19. int len, sublen;
  20. len = 0;
  21. va_list vlist;
  22. va_start(vlist, format);
  23. while( *pos )
  24. {
  25. char ch = *pos;
  26. if( ch != '%' )
  27. {
  28. putchar( ch );
  29. sublen = 1;
  30. pos++;
  31. }
  32. //處理轉義字符
  33. else
  34. {
  35. char nch = *(pos+1);
  36. //處理單字符轉義
  37. if( 'c' == nch )
  38. {
  39. char tch = va_arg(vlist, char);
  40. putchar(tch);
  41. pos += 2;
  42. sublen = 1;
  43. }
  44. //處理字符串轉義
  45. else if( 's' == nch )
  46. {
  47. char *tstr = va_arg(vlist, char*);
  48. sublen = PrintStr(tstr);
  49. pos += 2;
  50. }
  51. else if( 'l' == nch )
  52. {
  53. char nnch = *(pos + 2);
  54. //處理整形數據轉義
  55. if( 'd' == nnch )
  56. {
  57. long tnum = va_arg(vlist, long);
  58. char tstr[21];
  59. _ltoa(tnum, tstr, 10);
  60. sublen = PrintStr(tstr);
  61. pos += 3;
  62. }
  63. //處理浮點形數據轉義
  64. else if( 'f' == nnch )
  65. {
  66. double tnum = va_arg(vlist, double);
  67. char tstr[101];
  68. gcvt(tnum, 10, tstr);
  69. sublen = PrintStr(tstr);
  70. pos += 3;
  71. }
  72. else
  73. {
  74. putchar('l');
  75. putchar(nnch);
  76. pos += 3;
  77. }
  78. }
  79. //處理兩個%的情況
  80. else if( '%' == nch )
  81. {
  82. putchar('%');
  83. pos += 2;
  84. sublen = 1;
  85. }
  86. else
  87. {
  88. pos++;
  89. sublen = 0;
  90. }
  91. }
  92. len += sublen;
  93. }
  94. va_end(vlist);
  95. return len;
  96. }
  97. int main()
  98. {
  99. int rr = MyPrintf("%ld, %lf, %c, %s\n",
  100. 456, 43.34, 'A', "hello, world");
  101. printf("%d\n", rr);
  102. return 0;
  103. }

如果大家發現我這個程序的BUG的話,歡迎提出,大家共同學習。

Copyright © Linux教程網 All Rights Reserved