fork(1) download
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <malloc.h>
  4.  
  5. typedef struct tag_string {
  6. char* c_str;
  7. size_t length;
  8. size_t capacity;
  9. } string;
  10.  
  11. string create_string(const char* str, size_t capacity) {
  12. string ret_val = {0};
  13. ret_val.length = strlen(str);
  14. ret_val.capacity = capacity;
  15. if (ret_val.length > ret_val.capacity) { /* 指定された大きさのバッファでは足りない */
  16. ret_val.capacity = ret_val.length;
  17. }
  18. ret_val.c_str = (char*) malloc(sizeof(char) * ret_val.capacity + sizeof(char)); /* 終端文字を考慮 */
  19. memset(ret_val.c_str, 0, sizeof(char) * ret_val.capacity + sizeof(char));
  20. strncpy(ret_val.c_str, str, ret_val.length);
  21. return ret_val;
  22. }
  23.  
  24. void destroy_string(string* p) {
  25. if (p->c_str) {
  26. free(p->c_str);
  27. p->c_str = NULL;
  28. p->length = p->capacity = 0;
  29. }
  30. }
  31.  
  32. /* begin, end */
  33. char* begin_string(string* str) {
  34. return str->c_str;
  35. }
  36. char* end_string(string* str) {
  37. return str->c_str + str->length; /* 終端文字を返す */
  38. }
  39. const char* cbegin_string(const string* str) {
  40. return str->c_str;
  41. }
  42. const char* cend_string(const string* str) {
  43. return str->c_str + str->length; /* 終端文字を返す */
  44. }
  45.  
  46. /* copy */
  47. void copy_string(string* s1, const string* s2) {
  48. if (s1->capacity >= s2->length) {
  49. strncpy(s1->c_str, s2->c_str, s2->length);
  50. s1->length = s2->length;
  51. memset(end_string(s1), 0, (s1->capacity - s1->length + 1) * sizeof(char));
  52. return;
  53. }
  54. /* s1のバッファには入りきらない */
  55. string ret_val = create_string(s2->c_str, s2->length);
  56. destroy_string(s1);
  57. *s1 = ret_val;
  58. }
  59.  
  60. /* compare */
  61. _Bool equal_string(const string* s1, const string* s2) {
  62. return !strcmp(s1->c_str, s2->c_str);
  63. }
  64.  
  65.  
  66. int main(void){
  67. string str1 = create_string("abcdef", 6);
  68. string str2 = create_string("abcdefg", 0);
  69. string str3 = create_string("", 10);
  70.  
  71. copy_string(&str2, &str1);
  72. copy_string(&str3, &str1);
  73.  
  74. printf("string: %s\nlength: %d\ncapacity:%d\n",
  75. str2.c_str, str2.length, str2.capacity);
  76. printf("string: %s\nlength: %d\ncapacity:%d\n",
  77. str3.c_str, str3.length, str3.capacity);
  78.  
  79. if (equal_string(&str1, &str2)) {
  80. printf("str1 == str2\n");
  81. }
  82.  
  83. destroy_string(&str1);
  84. destroy_string(&str2);
  85. destroy_string(&str3);
  86. return 0;
  87. }
  88.  
Success #stdin #stdout 0s 2288KB
stdin
Standard input is empty
stdout
string: abcdef
length: 6
capacity:7
string: abcdef
length: 6
capacity:10
str1 == str2