动态分配内存输出文本中的单词的四种做法

题目:有一段文本,将文本中的所有单词,存放到一个字符指针数组中(要求每个单词内存恰好)。

  • 第一种做法
  • char c[] = "     asd afil     kjgl    rip  kjgdr  gds  sdg  gs ";
  • char b[10] = {0};
  • char *a[10] = {NULL};
  • int i = 0, j = 0,k = 0;     //i使字符不断后移,j用来标识指针a,k用来标识中间字符数组b;
  • while (1) {//把字符串的‘\0‘ 作为if判断的条件,避免遇到\0不在判断
  • if (c[i] != ‘ ‘ && c[i] != ‘\0‘) {
  • b[k++] = c[i++];
  • continue; //提高效率,当进行此if判断时,就不在进行一下if判断
  • }
  • if ((c[i] == ‘ ‘ || c[i] == ‘\0‘) && k != 0) {
  • //k判断是否有字符赋给b数组,没有的话意味着前面是空空格,就不在需要进行判断,提高运行效率
  • b[k] = ‘\0‘;                 //给数组b加上\0 ,结束字符
  • a[j] = malloc(strlen(b) + 1); //为指针开辟空间
  • strcpy(a[j], b);          //b是首地址,a[j]也是首地址,函数具有复制功能,如:%s
  • k = 0;
  • j++;
  • }
  • if (c[i] == ‘\0‘) {           //把while中的\0判断移到可以先判断\0的情况
  • break;
  • }
  • i++;
  • }
  • for (int i = 0 ; i  < j ; i++ ) {
  • printf("%s\n", a[i]);        //int a = 10; int *b = null;   b = &a; *b = 10;
  • free(a[i]);                  //* 具有指向功能,
  • a[i] = NULL;
  • }
  • 第二种做法
  • char str[] = "        a41 a1421     b3511 b b    c c c c       dddddd      jkthku";
  • //2.如何存储一个单词?
  • char tempStr[20] = {0}; //存储文本中的一个单词
  • //3.如何存储堆区空间的地址?
  • char *p[255] = {0};
  • //4.如何查找单词,并且将对应的单词存放到临时数组中?
  • int i = 0; //标识str字符串中字符的下标
  • int j = 0; //标识tempStr字符串中字符的下标
  • int k = 0; //标识指针数组中元素的下标.
  • while (1) {
  • if (str[i] != ‘ ‘ && str[i] != ‘\0‘) {
  • //当获取到的元素不为空格时,将它存储到临时数组tempStr中.
  • tempStr[j++] = str[i];
  • } else if (j != 0) {
  • //当遇到空格,或者遇到\0时.单词的存放结束
  • tempStr[j] = ‘\0‘; //最后一个元素补上\0
  • //动态计算所需堆区空间的大小,将地址存放到对应的字符指针数组元素中
  • p[k] = malloc(strlen(tempStr) + 1);
  • //将临时数组tempStr中字符串拷贝到对应堆区空间上.
  • strcpy(p[k], tempStr);
  • k++;
  • j = 0; //存储下一单词时,又从数组的第一个字符开始.
  • }
  • //当读取到\0时,字符串读取完毕,跳出循环
  • if (str[i] == ‘\0‘) {
  • break;
  • }
  • i++;  //移动到str数组中的下一个元素
  • }
  • for (int i = 0; i < k; i++) {
  • printf("%s ", p[i]);
  • free(p[i]);
  • p[i] = NULL;
  • }
  • 第三种做法

  • char str[50] ="  qwo   shi shui nishi   hhdj";
  • char temp[20] = {0};
  • char *p[10] = {0};
  • int count = 0;
  • int d = 0,i = 0,index = 0,h = 0;
  • while (str[i] != ‘\0‘) {
  • if (str[i] != ‘ ‘) {
  • count ++;
  • i ++;
  • index = i - count;
  • }
  • if (str[i] == ‘ ‘ || str[i] == ‘\0‘  ){
  • if (count != 0) {
  • int k = 0;
  • for (int j = index; j < i;j ++) {
  • temp[k] = str[j];
  • k ++;
  • d = k;
  • }
  • temp[k] = ‘\0‘;
  • printf("%s\n",temp);
  • p[h] = malloc(count + 1);
  • strcpy(p[h], temp);
  • h ++;
  • count = 0;
  • }
  • i ++;
  • }
  • }
  • for (int i = 0; i < h; i ++) {
  • printf("%s ",p[i]);
  • free(p[i]);
  • p[i] = NULL;
  • }
  • 第四种做法

  • char a[] = "  The end of   the World Cup does not mean the end of international competition in Brazil this year";
  • char *p[100] = {0};  //记录单词
  • char temp[100] = {0};  //临时记录单词
  • int i = 0;    //记录a[]数组元素的位置
  • int j = 0;    //记录单词的个数
  • int k = 0;    //记录temp[]数组中临时单词的字母个数(元素位置)
  • int count = 0;
  • while (a[i] != ‘\0‘) {
  • if ((a[i] >= ‘a‘ && a[i] <= ‘z‘) || (a[i] >= ‘A‘ && a[i] <= ‘Z‘)) {
  • count++;
  • temp[k] = a[i];
  • k++;
  • } else if (k != 0) {
  • temp[k] = ‘\0‘;
  • k = 0;
  • p[j] = malloc(sizeof(char) * count + 1);
  • strcpy(p[j], temp);
  • printf("%s ", p[j]);
  • free(p[j]);
  • p[j] = NULL;
  • j++;
  • count = 0;
  • }
  • if (a[i + 1] == ‘\0‘ && a[i] != ‘ ‘) {
  • temp[k] = ‘\0‘;
  • k = 0;
  • p[j] = malloc(sizeof(char) * count + 1);
  • strcpy(p[j], temp);
  • printf("%s ", p[j]);
  • free(p[j]);
  • p[j] = NULL;
  • }
  • i++;
  • }

over


动态分配内存输出文本中的单词的四种做法

时间: 2024-10-13 13:53:39

动态分配内存输出文本中的单词的四种做法的相关文章

如何使用linux命令统计文本中某个单词的出现频率

使用这个命令查出文本中的单词出现频率按照由高到底排序 cat words.txt |tr -cs "[a-z][A-Z]" "[\012*]"|tr A-Z a-z|sort|uniq -c|sort -k1nr -k2|head -10 但是有时我们想查找出某一个单词的出现频率这时我们可以使用如下几个命令 文件名称:file  查找单词名称:word 操作命令: (1)more file | grep -o word | wc -l (2)cat file | g

java中内部类的创建四种情况,三种方式,及内部数据访问权限

内部类和外部类的关系,及内部静态类的数据访问权限,声明方式. 第一种,在外部类内部声明使用内部类,内部类的类型为static和非 static类型,内部类数据类型为private,protected,public 类型的访问权限.外部类为非静态声明和权限如下: package com; public class Test1 { //@author 张春蕾 private class Name{ private int i =1; public int s = 2; protected int m

PHP从数组中删除元素的四种方法实例

本篇文章主要介绍了PHP从数组中删除元素的四种方法实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 茴香豆的"茴"字有四种写法,PHP从数组中删除元素也有四种方法 ^_^. 删除一个元素,且保持原有索引不变 使用 unset 函数,示例如下: <?php $array = array(0 => "a", 1 => "b", 2 => "c"); unset($array[

mysql中模糊查询的四种用法介绍

下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] WHERE u_name LIKE '%三%' 将会把u_name为“张三”,“张猫三”.“三脚猫”,“唐三藏”等等有“三”的记录全找出来. 另外,如果需要找出u_name中既有“三”又有“猫”的记录,请使用and条件 SELECT * FROM [user] WHERE u_name LIKE

jqGrid中实现radiobutton的两种做法

http://blog.sina.com.cn/s/blog_4f925fc30102e27j.html   jqGrid中实现radiobutton的两种做法 -------------------------------------------------------------------------------------------------- 第一种:colModel: [                {                    name: 'MY_ID',    

《深入理解C#》代码片段-用Dictionary&lt;TKey,TValue&gt;统计文本中的单词

1 public class Words 2 { 3 public static Dictionary<string, int> CountWords(string text) 4 { 5 Dictionary<string, int> frequencies;//创建从单词到频率的新映射 6 frequencies = new Dictionary<string, int>(); 7 string[] words = Regex.Split(text, @"

JAVA中运用数组的四种排序方法

JAVA中在运用数组进行排序功能时,一般有四种方法:快速排序法.冒泡法.选择排序法.插入排序法. 快速排序法主要是运用了Arrays中的一个方法Arrays.sort()实现. 冒泡法是运用遍历数组进行比较,通过不断的比较将最小值或者最大值一个一个的遍历出来. 选择排序法是将数组的第一个数据作为最大或者最小的值,然后通过比较循环,输出有序的数组. 插入排序是选择一个数组中的数据,通过不断的插入比较最后进行排序.下面我就将他们的实现方法一一详解供大家参考. <1>利用Arrays带有的排序方法快

JAVA中实现多线程的四种方式

Java中多线程实现方式主要有四种:1<继承Thread类.2<实现Runnable接口.3<实现Callable接口通过FutureTask包装器来创建Thread线程.4<使用ExecutorService.Callable.Future实现有返回结果的多线程. 其中前两种方式线程执行完后都没有返回值,后两种是带返回值的. 1.继承Thread类创建线程 Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例.启动线程的唯一方法就是通过Thread类的s

IOS中Json解析的四种方法

作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验(点击打开链接).此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便. 从IOS5开始,APPLE提供了对json的原生支持(NSJSONSerialization),但是为了兼容以前的ios版本,可以使用第三方库来解析Json. 本文将介绍TouchJso