| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7014 人关注过本帖
标题:两种方法将一段英文文字拆分成单词依次输出,但是一个成功,一个失败
取消只看楼主 加入收藏
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
结帖率:90%
收藏
已结贴  问题点数:10 回复次数:8 
两种方法将一段英文文字拆分成单词依次输出,但是一个成功,一个失败
#define _STDC_WANT_LIB_EXT1_1
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>
#define max_word 20

size_t wordscount(char *);
char** wordfind(char*, char** const);
main(void)
{
    size_t str_size = 1000;
    char buf_len[100];
    char *str_len = malloc(str_size);
    *str_len = '\0';
    char* ptemp = NULL;
    while (true)
    {
        gets_s(buf_len, sizeof(buf_len));
        if (buf_len[0] == '\0')
            break;
        if (strlen(buf_len) + strlen(str_len) + 1 > str_size)
        {
            str_size = str_size + 100;
            ptemp = realloc(str_len, str_size);
            str_len = ptemp;
            ptemp = NULL;
        }
        if (strcat_s(str_len, str_size, buf_len))
        {
            printf("Somethings wrong!The string concatenation failed!\n");
            return 1;
        }
    }
    printf("the words number is %zd\n", wordscount(str_len));

    char** words = malloc(wordscount(str_len)*sizeof(char*));
    for (size_t i = 0; i < wordscount(str_len); i++)
    {
        *(words+i) = (char*)malloc(max_word);
    }
    char** pstr_len=wordfind(str_len, words);
    for (size_t i = 0; i < wordscount(str_len); i++)
    {
        printf("%s\n", pstr_len[i]);
    }
   
    return 0;
}
size_t wordscount(char* pstr)
{
    size_t i = 0;
    size_t count = 0;
    while (pstr[i] != '\0')
    {
        if (!isalpha(pstr[i]))
        {
            if (pstr[i] == ',')
            {
                i++;
                continue;
            }
            else
            {
                count++;
            }
        }
        i++;
    }
    return count;
}
char** wordfind(char* pstr, char** const words)
{
    size_t i = 0;
    size_t j = 0;
    int count = 0;
    while (pstr[i] != '\0')
    {
        if (pstr[i] == ',')
        {
            i++;
            continue;
        }
        if (isalpha(pstr[i]))
        {
            words[count][j] = pstr[i];
            i++;
            j++;
        }
        else
        {
            words[count][j] = '\0';
            count++;
            j = 0;
            i++;
        }
    }
    return words;
}
这是第一个方法,成功了。
#define _STDC_WANT_LIB_EXT1_1
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>
#define max_word 20

size_t wordscount(char *);
char** wordfind(char*, char** const);
main(void)
{
    size_t str_size = 1000;
    char buf_len[100];
    char *str_len = malloc(str_size);
    *str_len = '\0';
    char* ptemp = NULL;
    while (true)
    {
        gets_s(buf_len, sizeof(buf_len));
        if (buf_len[0] == '\0')
            break;
        if (strlen(buf_len) + strlen(str_len) + 1 > str_size)
        {
            str_size = str_size + 100;
            ptemp = realloc(str_len, str_size);
            str_len = ptemp;
            ptemp = NULL;
        }
        if (strcat_s(str_len, str_size, buf_len))
        {
            printf("Somethings wrong!The string concatenation failed!\n");
            return 1;
        }
    }
    printf("the words number is %zd\n", wordscount(str_len));

    char** words = malloc(wordscount(str_len)*sizeof(char*));
    for (size_t i = 0; i < wordscount(str_len); i++)
    {
        *(words+i) = (char*)malloc(max_word);
    }
    char** pstr_len=wordfind(str_len, words);
    for (size_t i = 0; i < wordscount(str_len); i++)
    {
        printf("%s\n", pstr_len[i]);
    }
   
    return 0;
}
size_t wordscount(char* pstr)
{
    size_t i = 0;
    size_t count = 0;
    while (pstr[i] != '\0')
    {
        if (!isalpha(pstr[i]))
        {
            if (pstr[i] == ',')
            {
                i++;
                continue;
            }
            else
            {
                count++;
            }
        }
        i++;
    }
    return count;
}
char** wordfind(char* pstr, char** const words)
{
    char delimiters[] = " \n,.;:?";
    char* strword = NULL;
    char* pword = strtok_s(pstr, delimiters, &strword);
    size_t i = 0;
    while (pword)
    {
        strcpy_s(words[i],strlen(pword)+1,pword);
        i++;
        pword = strtok_s(NULL, delimiters, &strword);
    }
    return words;
}

这是第二种方法失败了。
搜索更多相关主题的帖子: 单词 英文 include 
2016-01-03 16:40
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
收藏
得分:0 
先定义两个自定义函数,一个是确定英文段落中单词个数,另一个函数是进行单词分割,存储在一个指针的指针里。
两种方法确定单词个数的函数是一样的,不一样的是分割单词的方法,第一种方法是搜寻英文段落每一个字符,只要是英文字符就放到数组里,当碰到空格或者是标点符号,表示一个单词存储完毕,换另一个单词进行存储。
第二种方法,利用strtok_s进行单词分割,找到一个单词就存到数组里,但是这种方法失败了,但是我到不到原因,希望大神给个指点,本人C语言全是自学的,如果有知道原因的,请说详细一些,谢谢。
2016-01-03 16:47
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
收藏
得分:0 
回复 4楼 诸葛欧阳
我用的没有问题,如果不用自定义函数的方法,只用main函数是可以的
2016-01-03 17:08
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
收藏
得分:0 
回复 6楼 ehszt
不可能,我用的vs2015 community,是不是编译器的问题,我用的是c11编写的。
2016-01-03 18:49
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
收藏
得分:0 
我用的是gets_s 给buf_len[100]输入字符,想结束输入时,按两下回车,具体输入是,先输入一行字母,然后按第一下回车,gets_s输入的字符串连接到str_len的指针里,当不想输入时,再按一下回车,buf_len[0] == '\0'条件满足,输入结束,这样的好处是,我可以无限输入我想输入的字符个数。
2016-01-03 19:13
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
收藏
得分:0 
回复 10楼 ehszt
i, love you.

the words number is 3
i
love
you
请按任意键继续. . .
这是我运行的结果,可以识别,忘了告诉你,我的程序只能识别,。和空格
2016-01-03 19:32
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
收藏
得分:0 
回复 12楼 ehszt
可能这个和个人喜欢有关吧,我一般都会加个空格,所以程序就这么编写了
2016-01-03 23:10
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
收藏
得分:0 
谢大神,我的最后也改好了,但是有个问题,size_t wordscount(str_len)这个函数,用在for(size_t i=0;i< wordscount(str_len);i++)根本无法循环,但是赋值后size_t a=wordscount(str_len)然后
for(size_t i=0;i< a;i++)循环就可以显示结果,到底是为什么
2016-01-04 12:16
foxeer
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:107
专家分:136
注 册:2015-12-29
收藏
得分:0 
回复 17楼 TonyDeng
谢大神,我的最后也改好了,但是有个问题,size_t wordscount(str_len)这个函数,用在for(size_t i=0;i< wordscount(str_len);i++)根本无法循环,但是赋值后size_t a=wordscount(str_len)然后
for(size_t i=0;i< a;i++)循环就可以显示结果,到底是为什么
2016-01-04 12:21
快速回复:两种方法将一段英文文字拆分成单词依次输出,但是一个成功,一个失败
数据加载中...
 
   



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

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