45.切割字符串并精确分配内存

运行结果:

源代码:

  1 #define _CRT_SECURE_NO_WARNINGS
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #include <string.h>
  5 
  6 //根据')'数量判断数据有多少行
  7 int getcharnum(char *str, char ch)
  8 {
  9     int num = 0;
 10     //strchr返回第一个找到的地址
 11     char *p = strchr(str, ch);
 12     while (p != NULL)
 13     {
 14         num++;
 15         p = strchr(p + 1, ch);
 16     }
 17 
 18     return num;
 19 
 20 }
 21 
 22 //删除字符,轮询法
 23 void deletech(char *str,char ch)
 24 {
 25     //备份地址
 26     char *pstr = str;
 27     while (*str != '')
 28     {
 29         //等于就赋值前进,不等于就不赋值前进
 30         if (*str != ch)
 31         {
 32             *pstr = *str;
 33             pstr++;
 34             str++;
 35         }
 36         else
 37         {
 38             str++;
 39         }
 40     }
 41     *pstr = 0;
 42 }
 43 
 44 void main()
 45 {
 46     //未经过处理的字符串
 47     char str[2048]= "我们还是当朋友好了(其实你还有可以利用的价值)
 48         我想我真的不适合你(我根本就不喜欢你!)
 49         其实你人真的很好(可是我不想和你在一起)
 50         你人真的很好(我是真的不想和你在一起)
 51         你人真的真的很好....真的(猪头, 离我远一点!)
 52         我暂时不想交男朋友(闪边啦!你还不到我心中帅哥标准的一半)
 53         我不想伤害我们之间的友谊(我们之间也只会有友谊)
 54         我心中牵挂着一个人(那个人是我专门为你这种人虚构的)
 55         我从来没想过这个问题(这是根本不可能的.还用想吗 ? )
 56         我不适合当个情人(废话, 没人会适合当你的情人的)
 57         你给我一段时间考虑(不给我时间, 我怎么溜啊)
 58         你的条件真的很好(可是还没好到我想要的地步)
 59         可是这样的感觉好怪(你这丑八怪, 怪到这样还想吃天鹅肉 ? )
 60         你的温柔我会铭记在心的(拜托, 情圣!光温柔是没用的, 还要有钱!)
 61         其实我一直没勇气接受你(看到你差点吓死, 哪还有勇气 ? )
 62         你真的很可爱(你真的很幼稚)
 63         你真的是超级可爱啦(猪头, 不要象小孩那样缠着我!)
 64         .遇到你, 总会让我重温童年的快乐(就象阿姨遇到小弟弟那样)
 65         我们应该给彼此一点缓冲时间(给你时间快滚, 再不走我要翻脸啦!)
 66         别人都说你条件不错啊(可我从来没这样认为!)
 67         如果我们早点认识就好了(可以让你早点觉悟!)
 68         别急嘛, 我们可以做朋友(趁这个时候我要找到我的白马王子啊~)";
 69 
 70     //根据')'个数获取一共有多少行
 71     int num = getcharnum(str, ')');
 72     printf("一共有%d行

", num);
 73 
 74     char **strall;//二级指针存储数据
 75     strall = (char **)malloc(sizeof(char *)*num);//分配内存,一共有多少行
 76 
 77     //i是下标,strall[i]
 78     int i = 0;
 79     //strtok:从指定位置开始,往后找到指定字符,并赋值为''
 80     for (char *pos = strtok(str, ")"); pos != NULL; pos = strtok(pos + strlen(pos)+1, ")"))
 81     {
 82         //分配内存并且拷贝
 83         strall[i] = (char *)malloc(sizeof(char)*strlen(pos));
 84         strcpy(strall[i], pos);
 85         //数据清洗,删除'	'和'('
 86         deletech(strall[i], '	');
 87         deletech(strall[i], '(');
 88         //下标增加
 89         i++;
 90     }
 91 
 92     //输出
 93     for (int i = 0; i < num; i++)
 94     {
 95         printf("%s
", strall[i]);
 96     }
 97     
 98     printf("%s", str);
 99 
100     system("pause");
101 }
原文地址:https://www.cnblogs.com/xiaochi/p/8360443.html