C语言 效率的典范还是肮脏的技巧?你有精巧的设计也拿来晒晒。

副组长 2011-02-18 12:24:50
加精
近来有个项目要求将大量的文本格式的数据读入,并转换成浮点数,要求效率。我写了如下几行代码,自己都感慨了一番。这是转换一行数据的代码,数据是用","分割的。

char* sm[MAX_SUBSTR];
for(int i=0; i<MAX_SUBSTR; i++)
{
sm[i] = pStr;
pStr = strstr(pStr,",");
if( NULL == pStr)
{
break;
}
*pStr++ = 0;
}

pStr是文本数据的指针,例如:"1.0,3.5,2.2 ...",MAX_SUBSTR宏是数据最大的个数。看看发生了什么。
博大家一笑而,顺便散点分。童鞋们有什么精巧的东西也拿来大家议议。
...全文
8878 203 打赏 收藏 转发到动态 举报
写回复
用AI写文章
203 条回复
切换为时间正序
请发表友善的回复…
发表回复
morrist1987 2011-10-10
  • 打赏
  • 举报
回复
学习了。。。
mycs2516 2011-08-24
  • 打赏
  • 举报
回复
效率应该可以吧
一条晚起的虫 2011-08-24
  • 打赏
  • 举报
回复
// 用for循环加判断,我觉得不会比while的效率差
// 估计编译器优化后,这两段差不多
do
{
//something
}hile(pStr)
//
for(;;)
{
//someting
if(!pStr)
break;
}
xiaolugege 2011-07-22
  • 打赏
  • 举报
回复
学习下
副组长 2011-06-28
  • 打赏
  • 举报
回复
[Quote=引用 259 楼 yjfkpyu 的回复:]
1. sm[i] = pStr; 指针是32位,赋给char型???
2. 既然讲究效率,为什么如此频繁调用strstr ???

结论:楼主的代码不像是熟悉c语言的人写出来
[/Quote]
兄弟啊,好好看看你的1。哥是从ALGOL60过来的人,听过没?
MSC从1开始到7,不知道你是不是出生了。
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 yxwsbobo 的回复:]

不是转换浮点么,楼主你没转换把

int GetFloat(char* szBuffer,int length)
{
char* TempBuffer = szBuffer;
int TempLength;
float Number;

while(TempBuffer - szBuffer < length)
{
TempLength = sscanf(Tem……
[/Quote]

我试了,你这个方法行不通,主要是这两行:

TempLength = sscanf(TempBuffer,"%f",&Number);
TempBuffer += TempLength+1;

sscanf()返回值是正确解析出的数据的个数,不能代表指针移动的距离
dongzeenum3 2011-05-04
  • 打赏
  • 举报
回复
大致看了看,卧虎藏龙啊。
hg2980986 2011-02-28
  • 打赏
  • 举报
回复
好长时间不学这东西了.
helllkz 2011-02-28
  • 打赏
  • 举报
回复
C++很差表示压力很大啊.平时都用C#..
z7861517 2011-02-28
  • 打赏
  • 举报
回复
发生什么了
huangchengbohuang 2011-02-28
  • 打赏
  • 举报
回复
目的是想找到,指针全部变NULL
altman2005 2011-02-28
  • 打赏
  • 举报
回复
我初学者,大牛们讨论的对我来说太深了。
dungeonsnd 2011-02-27
  • 打赏
  • 举报
回复
kobe198702 2011-02-27
  • 打赏
  • 举报
回复
楼主说下,什么叫转成浮点数。。。
AlburtHoffman 2011-02-27
  • 打赏
  • 举报
回复
如果追求效率的话,就用C来写,且不要函数调用,直接循环。
矮土豆 2011-02-27
  • 打赏
  • 举报
回复
我觉得不需要用多级指针
liuxiaodong1234 2011-02-26
  • 打赏
  • 举报
回复
嗯,,,看不懂,我正处于初学期
hdg3707 2011-02-26
  • 打赏
  • 举报
回复
学习了,很少数派用普通C编程了
JoeBlackzqq 2011-02-26
  • 打赏
  • 举报
回复

void CDDlg::OnButton1()
{
char sql[128] = "1.0,3.5,2.2,12.32,14.2";
char spliter[] = ", \r\n";
char* p = NULL;
p = strtok(sql, spliter);
while(p)
{
MessageBox(p);
p = strtok(NULL, spliter);
}
}
vnking 2011-02-26
  • 打赏
  • 举报
回复
楼主的代码楼主做主。
加载更多回复(183)

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧