鱼C论坛

 找回密码
 立即注册
查看: 927|回复: 9

C++小白求助

[复制链接]
发表于 2021-11-20 17:33:52 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 kkken 于 2021-11-20 17:35 编辑

想输出等于的内容,而它们是在?/&之间,加号是空一格的意思。
eg
cin>>anb?ef=12+3&g=ab&sk=&hijk=12-A
cout:
[hijk] equals [12-A]
[sk ] equals [ ]
[g   ] equals [ab]
[ef  ] equals [12 3]

左边的[ ] 大小要一致。
只能用iostream 和cstring。

谢谢各位大神。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-20 20:19:34 | 显示全部楼层
解析这个字符串不让用库函数就不好整,还要限定 只能用iostream 和cstring,就更不好整了

main.cpp
  1. #include "list.h"
  2. #include <iostream>
  3. #include <cstring>

  4. list_t *split(const char *str, char sep) {
  5.     list_t *res = list_init();
  6.     const char *begin = str;
  7.     for(size_t i = 0; ; ++i) {
  8.         if(*begin == '\0') break;
  9.         if(str[i] == '\0' || str[i] == sep) {
  10.             size_t size = &str[i] - begin;
  11.             char *temp = (char *)malloc(size + 1);
  12.             memcpy(temp, begin, size);
  13.             temp[size] = '\0';
  14.             list_append(res, temp, size + 1);
  15.             free(temp);
  16.             begin = str[i] != '\0' ? &str[i] + 1 : &str[i];
  17.         }
  18.     }
  19.     return res;
  20. }

  21. void split_equals(const list_t *list, list_t *left, list_t *raw_right) {
  22.     char buff[1024];
  23.     list_clean(left); list_clean(raw_right);
  24.     for(size_t i = 0; i < list_size(list); ++i) {
  25.         list_get(list, i, buff, 1024);
  26.         list_t *temp = split(buff, '=');
  27.         list_get(temp, 0, buff, 1024);
  28.         list_append(left, buff, strlen(buff) + 1);
  29.         if(list_size(temp) == 2) {
  30.             list_get(temp, 1, buff, 1024);
  31.             list_append(raw_right, buff, strlen(buff) + 1);
  32.         } else list_append(raw_right, " ", 2);
  33.         list_deinit(temp);
  34.     }
  35. }

  36. void output(const list_t *left, const list_t *raw_right) {
  37.     size_t count = 0;
  38.     char buff[1024];
  39.     for(size_t i = 0; i < list_size(left); ++i) {
  40.         list_get(left, i, buff, 1024);
  41.         size_t temp = strlen(buff);
  42.         count = count < temp ? temp : count;
  43.     }
  44.     for(size_t i = 0; i < list_size(left); ++i) {
  45.         list_get(left, i, buff, 1024);
  46.         std::cout << '[' << buff;
  47.         size_t space_count = count - strlen(buff);
  48.         for(size_t j = 0; j < space_count; ++j) std::cout << ' ';
  49.         std::cout << "] equals [";
  50.         list_get(raw_right, i, buff, 1024);
  51.         list_t *right = split(buff, '+');
  52.         const char *sep = "";
  53.         for(size_t j = 0; j < list_size(right); ++j) {
  54.             list_get(right, j, buff, 1024);
  55.             std::cout << sep << buff;
  56.             sep = " ";
  57.         }
  58.         list_deinit(right);
  59.         std::cout << ']' << std::endl;
  60.     }
  61. }

  62. int main(void) {
  63.     char buff[1024]; fgets(buff, 1024, stdin);
  64.     buff[strlen(buff) - 1] = '\0';
  65.     list_t *list = split(buff, '&');
  66.     list_get(list, 0, buff, 1024);
  67.     list_t *temp = split(buff, '?');
  68.     list_get(temp, 1, buff, 1024);
  69.     list_set(list, 0, buff, strlen(buff) + 1);  // 去掉?前面的内容
  70.     list_deinit(temp);
  71.     list_t *left = list_init();
  72.     list_t *raw_right = list_init();
  73.     split_equals(list, left, raw_right);
  74.     list_deinit(list);
  75.     output(left, raw_right);
  76.     list_deinit(raw_right);
  77.     list_deinit(left);
  78.     return 0;
  79. }
复制代码


list.h
  1. #ifndef _LIST_H_
  2. #define _LIST_H_

  3. #include <stddef.h>
  4. #include <stdbool.h>

  5. struct list_node_tag {
  6.     void *data; size_t size;
  7.     struct list_node_tag *next;
  8. };

  9. typedef struct {
  10.     struct list_node_tag *head;
  11.     size_t size;
  12. } list_t;

  13. list_t *list_init(void);
  14. void list_deinit(list_t *list);
  15. bool list_clean(list_t *list);
  16. bool list_insert(list_t *list, size_t index, const void *data, size_t size);
  17. bool list_delete(list_t *list, size_t index);
  18. bool list_get(const list_t *list, size_t index, void *data, size_t size);
  19. bool list_set(list_t *list, size_t index, const void *data, size_t size);
  20. bool list_append(list_t *list, const void *data, size_t size);
  21. size_t list_size(const list_t *list);
  22. bool list_empty(const list_t *list);

  23. #endif
复制代码


list.c
  1. #include "list.h"
  2. #include <stdlib.h>
  3. #include <memory.h>

  4. list_t *list_init(void) {
  5.     list_t *list = (list_t *)malloc(sizeof(*list));
  6.     if(!list) return NULL;
  7.     list->head = NULL;
  8.     list->size = 0;
  9.     return list;
  10. }

  11. void list_deinit(list_t *list) {
  12.     if(!list) return;
  13.     list_clean(list);
  14.     free(list);
  15. }

  16. bool list_clean(list_t *list) {
  17.     if(!list) return false;
  18.     while(!list_empty(list)) list_delete(list, 0);
  19.     return true;
  20. }

  21. bool list_insert(list_t *list, size_t index, const void *data, size_t size) {
  22.     if(!list) return false;
  23.     if(list_size(list) < index) return false;
  24.     if(!data) return false;
  25.     struct list_node_tag **current = &list->head;
  26.     while(index--) current = &(*current)->next;
  27.     struct list_node_tag *node = (struct list_node_tag *)malloc(sizeof(*node));
  28.     if(!node) return false;
  29.     node->data = malloc(size);
  30.     if(!node->data) {free(node); return false;}
  31.     memcpy(node->data, data, size);
  32.     node->size = size;
  33.     node->next = *current;
  34.     *current = node;
  35.     ++list->size;
  36.     return true;
  37. }

  38. bool list_delete(list_t *list, size_t index) {
  39.     if(!list) return false;
  40.     if(list_size(list) <= index) return false;
  41.     struct list_node_tag **current = &list->head;
  42.     while(index--) current = &(*current)->next;
  43.     struct list_node_tag *temp = *current;
  44.     *current = temp->next;
  45.     free(temp->data); free(temp);
  46.     --list->size;
  47.     return true;
  48. }

  49. bool list_get(const list_t *list, size_t index, void *data, size_t size) {
  50.     if(!list) return false;
  51.     if(list_size(list) <= index) return false;
  52.     if(!data) return false;
  53.     struct list_node_tag *const *current = &list->head;
  54.     while(index--) current = &(*current)->next;
  55.     struct list_node_tag *temp = *current;
  56.     if(temp->size > size) return false;
  57.     memcpy(data, temp->data, temp->size);
  58.     return true;
  59. }

  60. bool list_set(list_t *list, size_t index, const void *data, size_t size) {
  61.     bool res = list_delete(list, index);
  62.     return res ? list_insert(list, index, data, size) : res;
  63. }

  64. bool list_append(list_t *list, const void *data, size_t size) {
  65.     if(!list) return false;
  66.     return list_insert(list, list_size(list), data, size);
  67. }

  68. size_t list_size(const list_t *list) {
  69.     if(!list) return 0;
  70.     return list->size;
  71. }

  72. bool list_empty(const list_t *list) {
  73.     if(!list) return true;
  74.     return list_size(list) == 0;
  75. }
复制代码

  1. $ g++-debug -o main main.cpp list.c
  2. $ ./main
  3. anb?ef=12+3&g=ab&sk=&hijk=12-A
  4. [ef  ] equals [12 3]
  5. [g   ] equals [ab]
  6. [sk  ] equals [ ]
  7. [hijk] equals [12-A]
  8. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-20 20:24:10 | 显示全部楼层
你不让我用 vector,还不让我自己写一个了?
我本来是打算用 vector 存储中间数据的,但是题目不让用,而且最近刚好写了 list,用C语言写的,就拿过来用一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-20 20:25:14 | 显示全部楼层
还有,最后必须是反序输出?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-20 20:29:12 | 显示全部楼层
只能用iostream 和cstring
那么,能不能这样?
  1. #include "list.h"
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-20 20:33:38 | 显示全部楼层
不能?
那这样呢?这次可是只有 iostream 和 cstring

  1. #include <iostream>
  2. #include <cstring>

  3. #ifndef _LIST_H_
  4. #define _LIST_H_

  5. struct list_node_tag {
  6.     void *data; size_t size;
  7.     struct list_node_tag *next;
  8. };

  9. typedef struct {
  10.     struct list_node_tag *head;
  11.     size_t size;
  12. } list_t;

  13. list_t *list_init(void);
  14. void list_deinit(list_t *list);
  15. bool list_clean(list_t *list);
  16. bool list_insert(list_t *list, size_t index, const void *data, size_t size);
  17. bool list_delete(list_t *list, size_t index);
  18. bool list_get(const list_t *list, size_t index, void *data, size_t size);
  19. bool list_set(list_t *list, size_t index, const void *data, size_t size);
  20. bool list_append(list_t *list, const void *data, size_t size);
  21. size_t list_size(const list_t *list);
  22. bool list_empty(const list_t *list);

  23. #endif

  24. list_t *list_init(void) {
  25.     list_t *list = (list_t *)malloc(sizeof(*list));
  26.     if(!list) return NULL;
  27.     list->head = NULL;
  28.     list->size = 0;
  29.     return list;
  30. }

  31. void list_deinit(list_t *list) {
  32.     if(!list) return;
  33.     list_clean(list);
  34.     free(list);
  35. }

  36. bool list_clean(list_t *list) {
  37.     if(!list) return false;
  38.     while(!list_empty(list)) list_delete(list, 0);
  39.     return true;
  40. }

  41. bool list_insert(list_t *list, size_t index, const void *data, size_t size) {
  42.     if(!list) return false;
  43.     if(list_size(list) < index) return false;
  44.     if(!data) return false;
  45.     struct list_node_tag **current = &list->head;
  46.     while(index--) current = &(*current)->next;
  47.     struct list_node_tag *node = (struct list_node_tag *)malloc(sizeof(*node));
  48.     if(!node) return false;
  49.     node->data = malloc(size);
  50.     if(!node->data) {free(node); return false;}
  51.     memcpy(node->data, data, size);
  52.     node->size = size;
  53.     node->next = *current;
  54.     *current = node;
  55.     ++list->size;
  56.     return true;
  57. }

  58. bool list_delete(list_t *list, size_t index) {
  59.     if(!list) return false;
  60.     if(list_size(list) <= index) return false;
  61.     struct list_node_tag **current = &list->head;
  62.     while(index--) current = &(*current)->next;
  63.     struct list_node_tag *temp = *current;
  64.     *current = temp->next;
  65.     free(temp->data); free(temp);
  66.     --list->size;
  67.     return true;
  68. }

  69. bool list_get(const list_t *list, size_t index, void *data, size_t size) {
  70.     if(!list) return false;
  71.     if(list_size(list) <= index) return false;
  72.     if(!data) return false;
  73.     struct list_node_tag *const *current = &list->head;
  74.     while(index--) current = &(*current)->next;
  75.     struct list_node_tag *temp = *current;
  76.     if(temp->size > size) return false;
  77.     memcpy(data, temp->data, temp->size);
  78.     return true;
  79. }

  80. bool list_set(list_t *list, size_t index, const void *data, size_t size) {
  81.     bool res = list_delete(list, index);
  82.     return res ? list_insert(list, index, data, size) : res;
  83. }

  84. bool list_append(list_t *list, const void *data, size_t size) {
  85.     if(!list) return false;
  86.     return list_insert(list, list_size(list), data, size);
  87. }

  88. size_t list_size(const list_t *list) {
  89.     if(!list) return 0;
  90.     return list->size;
  91. }

  92. bool list_empty(const list_t *list) {
  93.     if(!list) return true;
  94.     return list_size(list) == 0;
  95. }

  96. list_t *split(const char *str, char sep) {
  97.     list_t *res = list_init();
  98.     const char *begin = str;
  99.     for(size_t i = 0; ; ++i) {
  100.         if(*begin == '\0') break;
  101.         if(str[i] == '\0' || str[i] == sep) {
  102.             size_t size = &str[i] - begin;
  103.             char *temp = (char *)malloc(size + 1);
  104.             memcpy(temp, begin, size);
  105.             temp[size] = '\0';
  106.             list_append(res, temp, size + 1);
  107.             free(temp);
  108.             begin = str[i] != '\0' ? &str[i] + 1 : &str[i];
  109.         }
  110.     }
  111.     return res;
  112. }

  113. void split_equals(const list_t *list, list_t *left, list_t *raw_right) {
  114.     char buff[1024];
  115.     list_clean(left); list_clean(raw_right);
  116.     for(size_t i = 0; i < list_size(list); ++i) {
  117.         list_get(list, i, buff, 1024);
  118.         list_t *temp = split(buff, '=');
  119.         list_get(temp, 0, buff, 1024);
  120.         list_append(left, buff, strlen(buff) + 1);
  121.         if(list_size(temp) == 2) {
  122.             list_get(temp, 1, buff, 1024);
  123.             list_append(raw_right, buff, strlen(buff) + 1);
  124.         } else list_append(raw_right, " ", 2);
  125.         list_deinit(temp);
  126.     }
  127. }

  128. void output(const list_t *left, const list_t *raw_right) {
  129.     size_t count = 0;
  130.     char buff[1024];
  131.     for(size_t i = 0; i < list_size(left); ++i) {
  132.         list_get(left, i, buff, 1024);
  133.         size_t temp = strlen(buff);
  134.         count = count < temp ? temp : count;
  135.     }
  136.     for(size_t i = 0; i < list_size(left); ++i) {
  137.         list_get(left, i, buff, 1024);
  138.         std::cout << '[' << buff;
  139.         size_t space_count = count - strlen(buff);
  140.         for(size_t j = 0; j < space_count; ++j) std::cout << ' ';
  141.         std::cout << "] equals [";
  142.         list_get(raw_right, i, buff, 1024);
  143.         list_t *right = split(buff, '+');
  144.         const char *sep = "";
  145.         for(size_t j = 0; j < list_size(right); ++j) {
  146.             list_get(right, j, buff, 1024);
  147.             std::cout << sep << buff;
  148.             sep = " ";
  149.         }
  150.         list_deinit(right);
  151.         std::cout << ']' << std::endl;
  152.     }
  153. }

  154. int main(void) {
  155.     char buff[1024]; fgets(buff, 1024, stdin);
  156.     buff[strlen(buff) - 1] = '\0';
  157.     list_t *list = split(buff, '&');
  158.     list_get(list, 0, buff, 1024);
  159.     list_t *temp = split(buff, '?');
  160.     list_get(temp, 1, buff, 1024);
  161.     list_set(list, 0, buff, strlen(buff) + 1);  // 去掉?前面的内容
  162.     list_deinit(temp);
  163.     list_t *left = list_init();
  164.     list_t *raw_right = list_init();
  165.     split_equals(list, left, raw_right);
  166.     list_deinit(list);
  167.     output(left, raw_right);
  168.     list_deinit(raw_right);
  169.     list_deinit(left);
  170.     return 0;
  171. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-20 20:34:43 | 显示全部楼层
  1. $ g++-debug -o main main.cpp
  2. $ ./main
  3. anb?ef=12+3&g=ab&sk=&hijk=12-A
  4. [ef  ] equals [12 3]
  5. [g   ] equals [ab]
  6. [sk  ] equals [ ]
  7. [hijk] equals [12-A]
  8. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-23 16:45:45 From FishC Mobile | 显示全部楼层
人造人 发表于 2021-11-20 20:25
还有,最后必须是反序输出?

须反序输出
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-23 17:00:09 | 显示全部楼层

那你改一下代码不就好了
  1. #include "list.h"
  2. #include <iostream>
  3. #include <cstring>

  4. list_t *split(const char *str, char sep) {
  5.     list_t *res = list_init();
  6.     const char *begin = str;
  7.     for(size_t i = 0; ; ++i) {
  8.         if(*begin == '\0') break;
  9.         if(str[i] == '\0' || str[i] == sep) {
  10.             size_t size = &str[i] - begin;
  11.             char *temp = (char *)malloc(size + 1);
  12.             memcpy(temp, begin, size);
  13.             temp[size] = '\0';
  14.             list_append(res, temp, size + 1);
  15.             free(temp);
  16.             begin = str[i] != '\0' ? &str[i] + 1 : &str[i];
  17.         }
  18.     }
  19.     return res;
  20. }

  21. void split_equals(const list_t *list, list_t *left, list_t *raw_right) {
  22.     char buff[1024];
  23.     list_clean(left); list_clean(raw_right);
  24.     for(size_t i = 0; i < list_size(list); ++i) {
  25.         list_get(list, i, buff, 1024);
  26.         list_t *temp = split(buff, '=');
  27.         list_get(temp, 0, buff, 1024);
  28.         list_append(left, buff, strlen(buff) + 1);
  29.         if(list_size(temp) == 2) {
  30.             list_get(temp, 1, buff, 1024);
  31.             list_append(raw_right, buff, strlen(buff) + 1);
  32.         } else list_append(raw_right, " ", 2);
  33.         list_deinit(temp);
  34.     }
  35. }

  36. void output(const list_t *left, const list_t *raw_right) {
  37.     size_t count = 0;
  38.     char buff[1024];
  39.     for(size_t i = 0; i < list_size(left); ++i) {
  40.         list_get(left, i, buff, 1024);
  41.         size_t temp = strlen(buff);
  42.         count = count < temp ? temp : count;
  43.     }
  44.     //for(size_t i = 0; i < list_size(left); ++i) {
  45.     for(size_t i = list_size(left) - 1; i != (size_t)-1; --i) {
  46.         list_get(left, i, buff, 1024);
  47.         std::cout << '[' << buff;
  48.         size_t space_count = count - strlen(buff);
  49.         for(size_t j = 0; j < space_count; ++j) std::cout << ' ';
  50.         std::cout << "] equals [";
  51.         list_get(raw_right, i, buff, 1024);
  52.         list_t *right = split(buff, '+');
  53.         const char *sep = "";
  54.         for(size_t j = 0; j < list_size(right); ++j) {
  55.             list_get(right, j, buff, 1024);
  56.             std::cout << sep << buff;
  57.             sep = " ";
  58.         }
  59.         list_deinit(right);
  60.         std::cout << ']' << std::endl;
  61.     }
  62. }

  63. int main(void) {
  64.     char buff[1024]; fgets(buff, 1024, stdin);
  65.     buff[strlen(buff) - 1] = '\0';
  66.     list_t *list = split(buff, '&');
  67.     list_get(list, 0, buff, 1024);
  68.     list_t *temp = split(buff, '?');
  69.     list_get(temp, 1, buff, 1024);
  70.     list_set(list, 0, buff, strlen(buff) + 1);  // 去掉?前面的内容
  71.     list_deinit(temp);
  72.     list_t *left = list_init();
  73.     list_t *raw_right = list_init();
  74.     split_equals(list, left, raw_right);
  75.     list_deinit(list);
  76.     output(left, raw_right);
  77.     list_deinit(raw_right);
  78.     list_deinit(left);
  79.     return 0;
  80. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-23 20:15:23 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 21:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表