fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void my_strcat(char **str, char **buf)
  6. {
  7. char *ptr;
  8. int n;
  9. int len;
  10.  
  11. /* 終端の\nを消す */
  12. len = strlen(*str);
  13. if (len) {
  14. ptr = *str + len - 1;
  15. if (*ptr == '\n') {
  16. *ptr = '\0';
  17. }
  18. }
  19. len = strlen(*buf);
  20. if (len) {
  21. ptr = *buf + len - 1;
  22. if (*ptr == '\n') {
  23. *ptr = '\0';
  24. }
  25. }
  26.  
  27. /* strとbuf分の領域確保 */
  28. n = strlen(*str) + strlen(*buf);
  29. ptr = (char *) realloc(*str, n + 1);
  30. if (ptr == NULL) {
  31. /* exit();するのでfree不要
  32.   free(*str);
  33.   free(*buf);
  34.   */
  35. exit(1);
  36. }
  37. *str = ptr;
  38.  
  39. /* bufをstrに結合する */
  40. if (n) {
  41. strcat(*str, *buf);
  42. }
  43.  
  44. return;
  45. }
  46.  
  47. int main(void)
  48. {
  49. int n;
  50. char *str, *buf;
  51.  
  52. /* 確保・初期化 */
  53. if (NULL == (str = (char *) malloc(30 * sizeof(char)))) {
  54. exit(1);
  55. }
  56. if (NULL == (buf = (char *) malloc(30 * sizeof(char)))) {
  57. exit(1);
  58. }
  59. *str = '\0';
  60.  
  61. /* 入力、連結 */
  62. for (n = 1;; ++n) {
  63. printf("input string_%d :", n);
  64. fgets(buf, 30, stdin);
  65. if (strcmp(buf, "quit\n") == 0) {
  66. /* quitと入力されたらループを抜ける */
  67. break;
  68. }
  69. my_strcat(&str, &buf);
  70. }
  71.  
  72. /* 表示 */
  73. printf("str = %s\n", str);
  74.  
  75. /* 終了 */
  76. free(str);
  77. free(buf);
  78. return 0;
  79. }
  80.  
Success #stdin #stdout 0s 2384KB
stdin
1
22
333
4444
55555
L16_111122223333
L29_111122223333444455556666@
L30_111122223333444455556666x@
L31_111122223333444455556666xy@
L32_111122223333444455556666xyz@
L36_AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHH
end
quit
stdout
input string_1 :input string_2 :input string_3 :input string_4 :input string_5 :input string_6 :input string_7 :input string_8 :input string_9 :input string_10 :input string_11 :input string_12 :input string_13 :input string_14 :input string_15 :input string_16 :input string_17 :input string_18 :str = 122333444455555L16_111122223333L29_111122223333444455556666@L30_111122223333444455556666x@L31_111122223333444455556666xy@L32_111122223333444455556666xyz@L36_AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHend