| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦   
共有 744 人关注过本帖
标题:字符数组的起始位置有空格吗?
收藏  订阅  推荐  打印
YuriGagarin
Rank: 1
等级:新手上路
帖子:34
积分:494
注册:2008-2-22
字符数组的起始位置有空格吗?

《C程序设计》教材里有这样一个例题(源于(第三版)P150):
输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。
  下面是书中的程序:
#include <stdio.h>
void main()
{
char string[81];
int i,num=0,word=0;
char c;
gets(string);
for (i=0;(c=string[i]) != '\0';i++)
{
  if (c == ' ')
   word=0;
  else if (word == 0)
   {
    word=1;
    num++;
   }
}
printf("There are %d words in the line.\n",num);
}

  下面是我自己改的程序:
#include <stdio.h>
void main()
{
char string[81];
int i,num=1;
char c;
gets(string);
for (i=0;(c=string[i]) != '\0';i++)
{
  if (c == ' ')
  num++;

}
printf("There are %d words in the line.\n",num);
}

  两个程序的区别基本都已经标出来了。我有两个问题:
1.教材的程序,一行字符的开头不统计空格;而我这个程序,因为是num初始化为1,是不是应该算作没有统计开头的空格呢??
  字符开头的空格怎么算呢??
2.教材中的程序,用word作为判别是否单词的标志——这是不是太麻烦了?
  我不用word,不也搞出来了?!!
  还是说,这个判别标志在大型程序中才能显出威力来??

[ 本帖最后由 YuriGagarin 于 2008-8-7 08:51 编辑 ]
2008-7-31 10:16
大风车
Rank: 1
等级:新手上路
帖子:10
积分:200
注册:2008-7-31

你好啊!
请问什么地方改变字体颜色的呢?
能不能告诉我。
2008-7-31 10:44
StarWing83
Rank: 12Rank: 12Rank: 12
来自:湖北工业大学
等级:版主
威望:9
帖子:2483
积分:26197
注册:2007-11-16

你试一下这组数据:
How   many   words     in    me?

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-7-31 10:59
StarWing83
Rank: 12Rank: 12Rank: 12
来自:湖北工业大学
等级:版主
威望:9
帖子:2483
积分:26197
注册:2007-11-16

给出一个不需要word的解决方法,不过比你课本上面的例子要慢,如果需要速度,可以把函数调用改为Hash,这样速度会很快。

#include <stdio.h>
#include <ctype.h>
int main()
{
    char str[81];
    int i,num=0;
    gets(str);
    for (i=0;str[i] != '\0';i++)
    {
        if (isalpha(str[i]) && str[i+1]!='-' && !isalpha(str[i+1]))
            num++;
    }
    printf("There are %d words in the line.\n",num);
}

[ 本帖最后由 StarWing83 于 2008-7-31 16:50 编辑 ]

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-7-31 11:04
vfdff
Rank: 6Rank: 6
等级:金牌会员
威望:4
帖子:1169
积分:13014
注册:2005-7-15

引用:
StarWing83 在 2008-7-31 11:04 的发言:

给出一个不需要word的解决方法,不过比你课本上面的例子要慢,如果需要速度,可以把函数调用改为Hash,这样速度会很快。

#include
#include
int main()
{
    char str[81];
    int i,num=0;
    gets(s ...
这个代码怎么就是 Hash 呢 ??
2008-7-31 13:46
starwing
Rank: 1
等级:新手上路
帖子:6
积分:162
注册:2006-12-20

晕……有没有理解我说的话啊??
再给出一个Hash版本的:

#include <stdio.h>
#include <ctype.h>
int main()
{
    char str[81];
    char ap[256]={0};
    int i,num=0;

    for (i=0;i<26;i++)ap[i+'a']=ap[i+'A']=1;
    gets(str);
    for (i=0;str[i] != '\0';i++)
    {
        if (ap[(int)str[i]] && (str[i+1]=='-' || !ap[(int)str[i+1]]))
            num++;
    }
    printf("There are %d words in the line.\n",num);
    return 0;
}
2008-7-31 14:24
YuriGagarin
Rank: 1
等级:新手上路
帖子:34
积分:494
注册:2008-2-22

有所领悟了!

  但是,那个字符串前面的空格呢??
  它是怎么统计的??
2008-7-31 15:42
StarWing83
Rank: 12Rank: 12Rank: 12
来自:湖北工业大学
等级:版主
威望:9
帖子:2483
积分:26197
注册:2007-11-16

- -你的教材上的程序压根儿就没有统计空格的数目,它统计的是空格字符紧跟非空格字符的序偶的数目。这种方法可以避免单词之间有多个空格而引起的错误,但是这种方法有局限性,对于形如“-- -- --- - . ”的字符串,该程序会将符号和标点也算作字符。

我的程序也是统计序偶,不过是在统计一个字母紧跟一个非字母(同时也不是连字符)的序偶,对于“I am.a New-one.”这种字符串,教材程序给出的答案错误,而我的程序可以得到正确的答案。

[ 本帖最后由 StarWing83 于 2008-7-31 16:50 编辑 ]

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-7-31 16:47
YuriGagarin
Rank: 1
等级:新手上路
帖子:34
积分:494
注册:2008-2-22

1.教材的程序,一行字符的开头不统计空格;而我这个程序,因为是num初始化为1,是不是应该算作没有统计开头的空格呢??
  字符开头的空格怎么算呢??


  判别标志的问题多少有些明白了。
  但是,那个“空格”问题呢??
  程序运行后,输入“I am a boy.”得到结果,两个程序都是4。
  一行开头的空格到底统计不统计啊??
2008-8-1 17:02
学不懂也要学C
Rank: 1
等级:新手上路
帖子:31
积分:448
注册:2008-7-3

那要是这样一段字符串“How many#%$^&*@!~words in me?
又要怎么样计算?
2008-8-2 17:30
共有 743 人关注过本帖
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.054773 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved