工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 4036|回复: 8

C 字符串压缩

[复制链接]
发表于 2006-7-25 13:08 | 显示全部楼层 |阅读模式
[字符串压缩]aaaabbbbb为a4b5,写成一个函数

CSDN上看到的题

我写的:

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <string.h>
  4. char *codeCompress(char *soure)
  5. {
  6.   char buffer;
  7.   int  account;
  8.   int  Len=strlen(soure);
  9.   char *ret=(char *)malloc(sizeof(char)*Len);
  10.   char *tmp=ret;
  11.   do{
  12.     account=1;
  13.     buffer=*soure;
  14.     *tmp++=buffer;
  15.     while(buffer==*++soure)
  16.     {
  17.       account++;
  18.       Len--;
  19.     }
  20.     itoa(account,tmp++,10);
  21.     Len++;
  22.     while(account/=10)
  23.     {
  24.       tmp++;
  25.       Len++;
  26.     }
  27.   }while(*soure);
  28.   *tmp='\0';
  29.   ret=realloc(ret,Len+1);
  30.   return ret;
  31. }     
  32. main()
  33. {
  34.   char *test;
  35.   test=codeCompress("HHHKKKKKKKKKKKKKKKKK  KKKKK");
  36.   printf("%s",test);
  37.   getch();
  38. }
复制代码
发表于 2006-7-25 13:42 | 显示全部楼层
想法应该就是这样子,但是有两个地方很明显感觉不好
1.没有对入口的参数进行检查,你知道传进来的会是什么样的值么?
2.返回一个指针指向的空间是在调用的函数里面分配的,没有在外面释放掉,我的想法是,直接在外面分配这个空间,然后传进去直接改,或者直接返回一个字符串....
回复

使用道具 举报

 楼主| 发表于 2006-7-25 13:55 | 显示全部楼层
原帖由 jinry 于 2006-7-25 13:42 发表
想法应该就是这样子,但是有两个地方很明显感觉不好
1.没有对入口的参数进行检查,你知道传进来的会是什么样的值么?
2.返回一个指针指向的空间是在调用的函数里面分配的,没有在外面释放掉,我的想法是,直接在外面分 ...


1,参数检查好像不必吧?如果不是char *类型的,编译不通过,

是char *类型的,好像也就没必要检查了(不过,如果char *指向的内容块的 \0  离首地址超远,那是另一回事了,使用者应该有一定的约束的吧,如果一个函数要做到对所有的异常都能处理,恐怕……
)

2,指针指向的空间还要使用呀,释放留给使用者做就可以了呀,如果返回字符串的话,这个字符串在内存的哪一部分?( 好像这种做法并不安全? )

师兄们指正

继续探讨……
回复

使用道具 举报

 楼主| 发表于 2006-11-23 00:38 | 显示全部楼层
Description
Problems involving the computation of exact values of very large magnitude and precision are common. For example, the computation of the national debt is a taxing experience for many computer systems.

This problem requires that you write a program to compute the exact value of Rn where R is a real number ( 0.0 < R < 99.999 ) and n is an integer such that 0 < n <= 25.

Input
The input will consist of a set of pairs of values for R and n. The R value will occupy columns 1 through 6, and the n value will be in columns 8 and 9.

Output
The output will consist of one line for each line of input giving the exact value of R^n. Leading zeros should be suppressed in the output. Insignificant trailing zeros must not be printed. Don't print the decimal point if the result is an integer.

Sample Input


95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12


Sample Output


548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
回复

使用道具 举报

发表于 2006-11-23 01:17 | 显示全部楼层
同意#2
在外面释放内存这种做法是不理想的。
回复

使用道具 举报

 楼主| 发表于 2007-4-21 23:18 | 显示全部楼层
现在再回头看这帖,应该是蝎子师兄说的对...
回复

使用道具 举报

发表于 2007-4-22 01:24 | 显示全部楼层
楼上说说现在看这个贴的心得。
貌似程序中会有内存泄漏......
回复

使用道具 举报

 楼主| 发表于 2007-4-22 16:05 | 显示全部楼层
主要是我觉得把释放内存的责任给函数调用者不是一个好主意
回复

使用道具 举报

发表于 2007-4-23 00:41 | 显示全部楼层
最好的应该是函数功能很单纯的那种,否则到后期会比较郁闷,因为自己以前就做过这种事情...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-8-31 05:51

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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