| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9935 人关注过本帖, 1 人收藏
标题:在字符串中提取单词的方法
取消只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏(1)
 问题点数:0 回复次数:6 
在字符串中提取单词的方法
在字符串中提取一个用约定分隔符分割的单词,是编程常用的操作。scanf()函数读取数据,主要靠的就是这个手段,因为输入流是字符串,要把各种用字符表达的数据转换为所需的类型,首先要把符合条件的单词分割出来,再进行转换处理。C语言处理这个操作,实际上是用strtok()函数,这个函数C程序员必须掌握,很常用。示例如下:

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

int main(void)
{
    char text[] = "I Love China !";                 // 被分割的字符串,必须是可编辑的,不能储存在常量区
    const char delimit[] = { ' ', '!', '\0' };      // 分割单词的字符集
    char* word = NULL;                              // 提取到的单词的指针
    char* nextWord = NULL;                          // 指示下次操作的入口指针,实际上是strok()在分割单词之后
                                                    // 置入的'\0'字符处,这就是源串不能是常量的原因

    word = strtok_s(text, delimit, &nextWord);
    while (word != NULL)
    {
        puts(word);
        word = strtok_s(NULL, delimit, &nextWord);
    }

    _getch();
    return EXIT_SUCCESS;
}


运行结果:
图片附件: 游客没有浏览图片的权限,请 登录注册

搜索更多相关主题的帖子: 单词 C语言 程序员 字符串 
2015-04-11 13:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
这个同时也是很典型的指针运用例子。留意word,仅仅是指针,我们并没有给它分配内存,那么它指向的地方实际上是哪里?结束符'\0'是怎么置入的?使用这个方案的时候,我们需要怎样的后续手段?假如源字符串在常量区怎么办?

授人以渔,不授人以鱼。
2015-04-11 13:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
其实,根据上面的实践和分析,已经可以想到strtok()函数是怎么实现的了,到时不用库函数,或改用其他语言,也懂怎么做同样的事情。这才是该学的,这才是基础。

授人以渔,不授人以鱼。
2015-04-11 14:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
顺便提一提之前有人问过的“输入输出型参数”。在strtok()函数的参数列表中,第二个是输入参数,第一个是输入和输出参数,第三个是输出参数,另外还有一个返回值。

授人以渔,不授人以鱼。
2015-04-11 14:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用纳兰伽香在2015-4-11 15:28:00的发言:

为啥我发的链接是黑的

我看得到啊

授人以渔,不授人以鱼。
2015-04-11 16:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用皮影09在2015-4-11 16:30:48的发言:

为什么第二次之后s就变成NULL了?从NULL里面找delimit理解不了啊。。。

这个函数是有延续动作的,第二次接收的参数为NULL,约定是从上一次标记的位置开始操作,否則,你可以重新设定一个不同的位置。这是函数作者设计的约定,很多程序设计技巧都这样用。

授人以渔,不授人以鱼。
2015-04-11 16:38
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
顺带回应“无功”网友询问在字符串中提取数字的办法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

void Pause(const char* message);
bool ScanInteger(const char* str, int* value);

int main(void)
{
    const char* str = "asd123qwe45 6mnb789xyz";
    int value;

    while (ScanInteger(str, &value))
    {
        printf_s("%d\n", value);
        str = NULL;
    }

    Pause(NULL);
    return EXIT_SUCCESS;
}

void Pause(const char* message)
{
    if (message == NULL)
    {
        message = "\nPress <Enter> key to continue...";
    }
    fflush(stdin);
    getchar();
}

bool ScanInteger(const char* str, int* value)
{
    char buffer[20];
    static const char* ptrStr = NULL;
    char* ptrBuffer = buffer;
    bool begin = false;
    bool end = false;

    if (str != NULL)
    {
        ptrStr = str;
    }
    while ((*ptrStr++ != '\0') && !end)
    {
        if (isdigit(*ptrStr))
        {
            if (!begin)
            {
                begin = true;
            }
            *ptrBuffer++ = *ptrStr;
        }
        else
        {
            if (begin)
            {
                end = true;
                *ptrBuffer = '\0';
                *value = atoi(buffer);
            }
        }
    }
    --ptrStr;

    return end;
}



[ 本帖最后由 TonyDeng 于 2015-4-15 20:24 编辑 ]

授人以渔,不授人以鱼。
2015-04-15 20:18
快速回复:在字符串中提取单词的方法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032878 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved