| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2468 人关注过本帖
标题:输入字符串,实现单词的分离并计数
只看楼主 加入收藏
林雅南
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2017-5-14
结帖率:0
收藏
已结贴  问题点数:20 回复次数:8 
输入字符串,实现单词的分离并计数
输入字符串,实现单词的分离并计数
用函数
不知道为什么编译出来什么word【i】根本没有
没有语法错误。
strC是计数,记录每个word【i】出现地次数
str是保存字符串
word【】【】是一个单词一个word【i】
求帮忙看一下,自己debug了一整天都不行,初学C语言,拜托指点一下。
#include <stdio.h>
#include <string.h>
#include<conio.h>
#include<ctype.h>
#define M 1000
#define N 20
void beep();
void GetPassage(char str[]);
void WordSepa(char str[],int strC[],char word[][20]);
void main()
{
 char str[M];
 int strC[N];
 char word[M/N][N];
 GetPassage(str);
 printf("%s\n",str);
 WordSepa(str,strC,word);
}
void beep(){
 printf("\07");
}
void GetPassage(char str[])
{
 char ch;
 int i=0;
 while(1){
 ch=getch();
 if(ch=='\r')
  break;
     if(ch=='\b'){
  if(i>0){
  printf("%c %c",ch,ch);
  i--;
  }
  else
   beep();
  continue;
 }
 if(ch!=32&&ch!=44&&ch!=46&&isalpha(ch)==0){
  beep();
  continue;}
 if(i<N){
 printf("%c",ch);
  str[i++]=ch;
 }
 else
   beep();
 
 }
 str[i]='\0';
}
void WordSepa(char str[],int strC[],char word[][20])
{
int i=0,j=0,k=0,t=0,x=0;
while(j<t)
{
for(;str[j]==32;j++);
while(k<N&&str[j]!=32)
word[i][k++]=str[j++];
word[i][k]='\0';
strC[i]=1;
for(x=0;x<i;x++)
if(stricmp(word[i],word[x])==0)
{
strC[x]++;
i--;
break;
}
i++;
k=0;
}
t=0;
for(;t<i;t++)
printf("%s(%d)\n",word[t],strC[t]);
}
搜索更多相关主题的帖子: include 字符串 C语言 单词 记录 
2017-05-14 17:40
林雅南
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2017-5-14
收藏
得分:0 
我知道对于大佬们来说很简单,但是我初学C啊,真的不知道哪里错了。求大佬们帮助
2017-05-14 17:54
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:4 
说说问题在哪儿?你举个例子也行啊。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-14 17:58
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
我没看你的代码,我说下写类似程序的思路。

用一个变量做为标记,当遇到一个字母的时候,更改标记,意味着进入单词输入状态。
当遇到空白字符、数字的时候,修改标记,表示离开单词输入状态。
以此循环。每一次进入单词输入状态,单词数计数器自增1.

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-14 18:00
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:4 
程序代码:
#include <stdio.h>
#include <string.h>
#include<conio.h>
#include<ctype.h>
#define M 1000
#define N 20
void beep();
void GetPassage(char str[]);
void WordSepa(char str[], char word[][M]);
int main()
{
    char str[M];
    int strC[N];
    char word[M/N][M];
    GetPassage(str);
    printf("%s\n",str);
    WordSepa(str, word);
}
void beep()
{
    printf("\07");
}
void GetPassage(char str[])
{
    char ch;
    int i=0;
    while(1)
    {
        ch=getchar();  //getch 是能读到字符,不能打印
        if(ch=='\n')
            break;
        /*else if(ch=='\b')
        {
            if(i>0)
            {
                printf("%c %c",ch,ch);
                i--;
            }
            else
                beep();
            continue;
        }
        else if(ch!=32&&ch!=44&&ch!=46&&isalpha(ch)==0)
        {
            beep();
            continue;
        }*/
        else if(i<M)
            str[i++]=ch;
        else
            beep();

    }
    str[i]='\0';
}
void WordSepa(char str[], char word[][M])
{
    int i=0, j = 0, k=0;
    int flag = 1;

    while(flag)              //j t初始值为0
    {
        for(; str[j]==32  || str[j] == 9 || !isalpha(str[j]); j++)
            ;
        while(isalpha(str[j]))
            word[i][k++] = str[j++];
        word[i][k] = '\0';
        printf("单词 %d : %s\n", i + 1, word[i]);
        k = 0;
        ++i;
        if(str[j] == '\0')
            flag = 0;
    }
}


改得有点多。你看看我这个思路再写写你自己想要的。有些没必要给你注释了。  getch得到的字符是不能打印的,记住这点。我这是window平台,换行是'\n'。把你计数的数组删除了。因为二维数组相当于有了计数的功能。
for(; !isalpha(str[j]); j++)只要这点就可以, 没删除原来的是为了你理解

[此贴子已经被作者于2017-5-14 19:39编辑过]

2017-05-14 19:33
烟雨晨曦
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:150
专家分:599
注 册:2017-3-5
收藏
得分:4 
这个类似词法分析器,之前好像写过。
程序代码:
#include <stdio.h>
#include <memory.h>
#include <string.h>
#include <stdlib.h>
int main()
{

    char word[100][2][50];//定义100个单词数组,单词长度不能超过50
    memset(word, '\0', 100*50*2);//清空数组
    char* str = "aaa bbb ccc aaa ccc ddd eeee AAAA DSFSDF DSXFGSEFDGS AAAA";
    char* p = str;
    int nCount = 0;
    int i = 0;
    bool bFind = false;

    //解析字符串
    while(*p)
    {
        i = 0;
        char cTmp[100] = "";
        bFind = false;

        //判断是否为字母开头
        if((*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z'))
        {
            //直到为空或者空格判定为一个单词
            while(*p != ' ' && *p)
            {
                cTmp[i++] = *p;
                p++;
            }
            
            //查找是否存在单词
            for(i = 0; i <= nCount; i++)
            {
                //存在数量加一
                if(strcmp(cTmp, word[i][0]) == 0)
                {
                    bFind = true;
                    int n = atoi(word[i][1]);
                    itoa(++n, word[i][1],10);
                    break;
                }
            }
            
            //不存在添加单词
            if(bFind == false)
            {
                strcpy(word[nCount][0],cTmp);
                strcpy(word[nCount][1],"1");
                nCount++;
            }
            
        }
        p++;
    }

    //遍历输出
    for(i = 0; i < nCount; i++)
    {
        printf("%s %d\n", word[i][0], atoi(word[i][1]));
    }
    return 0;
}


[此贴子已经被作者于2017-5-14 21:59编辑过]

2017-05-14 21:46
aleegang
Rank: 1
等 级:新手上路
帖 子:5
专家分:7
注 册:2017-5-14
收藏
得分:4 
回复 6楼 烟雨晨曦
牛🐮,学习了😊
2017-05-14 23:09
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:4 
学了数据结构后~可以通过用B树来优化搜索结构~毕竟感觉一个一个进行重复性检验匹配效率不会太高~~

PS:有两种优化方法~第一种是按完整关键字匹配~可以用B树~~特例AVL树也可以~

第二种方法就是模仿查字典~先搜首字母再搜第二个一直看该单词是否在词库里面~B树信息记录单个字母就行了~感觉用三度B树效率最高~小于该关键字的在左节点~等于关键字的在中间节点~大于其关键字在右边节点~

两种方法效率前者取决于单词数量(可以按评估接受单词数量而调整B树的度)~后者取决于单词的平均长度~由于单词长度有一定范围~所以记录小量单词可以考虑第一种方法~记录大量单词可以考虑第二种方法~

[此贴子已经被作者于2017-5-15 00:45编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-14 23:46
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
https://bbs.bccn.net/thread-476674-1-1.html

不知道有多少人看过这题~认真思考一下就觉得很简单吧~问题是怎么提高搜索效率~要高效的话就要考虑B树结构了~

突然发现即使是用B树结构也有特例不能优化~对于关键字能有多组匹配的时候就会退化成一般算法了~当然这是最差情况~最好情况的优化空间还是很大的~

[此贴子已经被作者于2017-5-15 11:19编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-15 00:53
快速回复:输入字符串,实现单词的分离并计数
数据加载中...
 
   



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

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