LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1452|回复: 21

简单的从一个buffer中提取word的编程

[复制链接]
发表于 2003-9-8 17:30:52 | 显示全部楼层 |阅读模式
兄弟现在练习写程序,要求是这样的:
已知一个buffer中有一句话,以空格或者多个空格或者tab分隔,并以‘\n’结尾。现在想从中安单词提取出写入不同的变量中,不知道怎样写才能最优化,希望各位不吝指教。谢谢!
发表于 2003-9-8 18:19:14 | 显示全部楼层
sscanf?
发表于 2003-9-8 18:26:43 | 显示全部楼层

  1. char buf[] = "...";
  2. char *t;

  3. buf[strlen(buf) - 1] = '\0'; /* 去除\n */
  4. t = strtok(buf, " \t"); /* t指向第一个word的第一个字符,word由空格或\t分隔 */
  5. while(t){
  6.   ...; /* 提取word,如strcpy(dest, t); */
  7.   t = strtok(NULL, " \t"); /* t指向下一个word */
  8. }
复制代码

strtok会破坏buf,把每个word的后一个字符换成\0,必要时应该把buf拷贝一份
 楼主| 发表于 2003-9-9 09:05:02 | 显示全部楼层
不是sscanf,主要是用来读取,程序的配置文件。
兄弟编程刚起步,不会的太多!谢谢大家的热心帮助
发表于 2003-9-9 13:09:14 | 显示全部楼层
char *p = buf;
while(issspace(*p)) p++;//跳过空格

while(!isspace(*p)) *dst++ = *p++;   dst是目标
就这样写
 楼主| 发表于 2003-9-9 16:06:38 | 显示全部楼层
没想到这么多人来响应,我有一个好的想法:把他们封装成一个函数
如:要求:返回值为第一个word,buf为去掉第一个word的其余部分。那么
可以通过多次调用取得所需的word的。
char *getword(char *buf)
{
char *p,*q;
char word[128];
p = buf;
q = word;
while(isspace(*p)) p++;
while(!isspace(*p)) *q++ =*p++;
*q = '\0';
strcpy(buf,p);
ruturn(word);
}
没有调试不知道可不可以;
还有一个想法就是
char *getword(char *buf,int n)
其中,buf为要分隔的一句话已空格或者多个空格或者\t或者“,”分隔,n为所需要取的第几个word值。
不知道大家有什么好的想法
欢迎讨论
发表于 2003-9-9 16:54:31 | 显示全部楼层
最初由 darksun 发表
没想到这么多人来响应,我有一个好的想法:把他们封装成一个函数
如:要求:返回值为第一个word,buf为去掉第一个word的其余部分。那么
可以通过多次调用取得所需的word的。
char *getword(char *buf)
{
char *p,*q;
char word[128];
p = buf;
q = word;
while(isspace(*p)) p++;
while(!isspace(*p)) *q++ =*p++;
*q = '\0';
strcpy(buf,p);
ruturn(word);
}
没有调试不知道可不可以;
还有一个想法就是
char *getword(char *buf,int n)
其中,buf为要分隔的一句话已空格或者多个空格或者\t或者“,”分隔,n为所需要取的第几个word值。
不知道大家有什么好的想法
欢迎讨论


这个破坏了buffer,而且有溢出的可能性。

  1. char *
  2. getword(char *buf)
  3. {
  4.     static char *p = buf;
  5.     char *q;
  6.     char word[128];
  7.     q = word;
  8.     while(isspace(*p)) p++;
  9.     while(!isspace(*p) && (q < word + 128)) *q++ =*p++;
  10.     *q = '\0';
  11.     ruturn(word);
  12. }
复制代码

也没调试,呵呵。
 楼主| 发表于 2003-9-9 17:33:44 | 显示全部楼层
我编写的函数编译成功可是会有一个
warning: function returns address of local variable
不影响执行。我想是因为我在主函数中定义的一个
char *bufline
bufline = getword(buf);
是不是因为bufline本身没有分配内存,而getword函数执行后释放内存,那么bufline中还能保存返回值吗?在哪里呢?
 楼主| 发表于 2003-9-9 17:44:05 | 显示全部楼层
这个破坏了buffer,而且有溢出的可能性。

源码:--------------------------------------------------------------------------------
char *
getword(char *buf)
{
    static char *p = buf;
    char *q;
    char word[128];
    q = word;
    while(isspace(*p)) p++;
    while(!isspace(*p) && (q < word + 128)) *q++ =*p++;
    *q = '\0';
    ruturn(word);
}
--------------------------------------------------------------------------------

是有缓冲区溢出的可能性,谢谢老兄。受教了。
可是---
这个只能取第一word吧?第二次执行取不了第二个word吧
发表于 2003-9-9 18:36:51 | 显示全部楼层
strtok不行吗?用库函数好一点吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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