鱼C论坛

 找回密码
 立即注册
查看: 1238|回复: 18

[已解决]怎样才能让字符数组根据输入的字符数自动变化大小

[复制链接]
发表于 2020-8-14 13:26:36 | 显示全部楼层 |阅读模式

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

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

x
代码

  1. #include<stdio.h>


  2. //这里被限制住了导致最大只能输入这么大的字符
  3. char str[10000000];



  4. int main() {
  5.     printf("请输入任意字符:");
  6.     fgets(str, sizeof(str) / sizeof(char), stdin);
  7.     fputs(str, stdout);

  8.     return 0;
  9. }
复制代码
最佳答案
2020-8-15 10:25:49
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<malloc.h>



  4. char* autoalloc_gets(char* str, size_t* capacity) {//自动扩容版的 gets
  5.     char* temp;
  6.     size_t index = 0;


  7.     for (;;) {
  8.         if (index + 1 < *capacity) {
  9.             switch (str[index] = getchar()) {//遇到以下字符,终止扫描
  10.                 case '\n':
  11.                 case '\r':
  12.                 case EOF:
  13.                     str[index] = '\0';//'\0' 的话,就不需要重置了

  14.                 case '\0':
  15.                     *capacity = index + 1;
  16.                     return (char*)realloc(str, *capacity * sizeof(char));
  17.             }

  18.             ++index;
  19.         }
  20.         else {//扩容
  21.             *capacity <<= 1;//默认扩容为原容量的 2 倍

  22.             if (temp = (char*)realloc(str, *capacity * sizeof(char))) {//为了防止 realloc 返回 NULL 造成内存泄露
  23.                 str = temp;
  24.             }
  25.             else {//扩容失败,直接返回
  26.                 str[index] = '\0';//放置字符串终止符
  27.                 *capacity >>= 1;//退回来
  28.                 return str;
  29.             }
  30.         }
  31.     }


  32.     return 0;//装饰,防止编译器报错
  33. }



  34. int main() {
  35.     size_t capacity = 100;
  36.     puts(autoalloc_gets((char*)malloc(100 * sizeof(char)), &capacity));
  37.     return 0;
  38. }
复制代码


这个就可以自动扩容啦~满意麻烦给个最佳哦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-14 13:41:10 | 显示全部楼层
#inclue<stdlib>

char * str;
int num;

scanf("%d",&num);
str = malloc(num);
...

free(str);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 13:45:20 | 显示全部楼层
如果是C++,则可以用std::string,如:

#include<string>

std::string str;

str = "hello";
str += " world";
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 13:56:00 | 显示全部楼层
我正在写自动扩容的 gets,稍等~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-15 06:15:54 | 显示全部楼层
你好,根据你的需求,你需要了解动态分配(malloc),然后学习链表,二叉树等数据结构即可完成。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-15 10:20:25 | 显示全部楼层
Shuranima 发表于 2020-8-15 06:15
你好,根据你的需求,你需要了解动态分配(malloc),然后学习链表,二叉树等数据结构即可完成。

你说的也太夸张了……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-15 10:25:49 | 显示全部楼层    本楼为最佳答案   
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<malloc.h>



  4. char* autoalloc_gets(char* str, size_t* capacity) {//自动扩容版的 gets
  5.     char* temp;
  6.     size_t index = 0;


  7.     for (;;) {
  8.         if (index + 1 < *capacity) {
  9.             switch (str[index] = getchar()) {//遇到以下字符,终止扫描
  10.                 case '\n':
  11.                 case '\r':
  12.                 case EOF:
  13.                     str[index] = '\0';//'\0' 的话,就不需要重置了

  14.                 case '\0':
  15.                     *capacity = index + 1;
  16.                     return (char*)realloc(str, *capacity * sizeof(char));
  17.             }

  18.             ++index;
  19.         }
  20.         else {//扩容
  21.             *capacity <<= 1;//默认扩容为原容量的 2 倍

  22.             if (temp = (char*)realloc(str, *capacity * sizeof(char))) {//为了防止 realloc 返回 NULL 造成内存泄露
  23.                 str = temp;
  24.             }
  25.             else {//扩容失败,直接返回
  26.                 str[index] = '\0';//放置字符串终止符
  27.                 *capacity >>= 1;//退回来
  28.                 return str;
  29.             }
  30.         }
  31.     }


  32.     return 0;//装饰,防止编译器报错
  33. }



  34. int main() {
  35.     size_t capacity = 100;
  36.     puts(autoalloc_gets((char*)malloc(100 * sizeof(char)), &capacity));
  37.     return 0;
  38. }
复制代码


这个就可以自动扩容啦~满意麻烦给个最佳哦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-15 13:08:08 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-15 10:25


这个就可以自动扩容啦~满意麻烦给个最佳哦~

收藏了,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-15 13:09:02 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-15 13:12:42 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-15 13:09
看这里
https://fishc.com.cn/thread-177756-1-1.html

那边收藏了,这边删除了

点评

嘿嘿  发表于 2020-8-15 13:13
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-17 09:56:22 | 显示全部楼层

不算吧,至少学了链表就行了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-17 10:42:54 | 显示全部楼层
Shuranima 发表于 2020-8-17 09:56
不算吧,至少学了链表就行了。

这要用链表?火箭打蚊子?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-21 13:22:23 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-17 10:42
这要用链表?火箭打蚊子?

链表也是火箭? 初学者都会吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-21 13:24:27 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-17 10:42
这要用链表?火箭打蚊子?

你这样说的搞得别人以为好难,都不敢去 碰,这有什么问题嘛?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-21 15:53:57 | 显示全部楼层
Shuranima 发表于 2020-8-21 13:24
你这样说的搞得别人以为好难,都不敢去 碰,这有什么问题嘛?


兄弟你属实逗笑我了,你也不看看你自己说的什么?
你好,根据你的需求,你需要了解动态分配(malloc),然后学习链表,二叉树等数据结构即可完成。
明明一个动态分配内存的问题,被你扯出来链表、二叉树,还说我 “搞得别人以为好难,都不敢去碰”,这不是贼喊捉贼么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-22 07:10:19 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-21 15:53
兄弟你属实逗笑我了,你也不看看你自己说的什么?明明一个动态分配内存的问题,被你扯出来链表、二叉树 ...

大哥,单说链表确实不难啊,是你这样说的好像很难一样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-22 10:30:58 | 显示全部楼层
Shuranima 发表于 2020-8-22 07:10
大哥,单说链表确实不难啊,是你这样说的好像很难一样。

这里体现的是“大材小用”,而非“很难”,好不好?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-22 10:43:09 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-22 10:30
这里体现的是“大材小用”,而非“很难”,好不好?

行行行,不争辩了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 19:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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