【问题标题】:Program to count length of each word in string in C计算C中字符串中每个单词的长度的程序
【发布时间】:2019-04-24 09:59:42
【问题描述】:

我正在编写一个程序来计算字符数组中每个单词的长度。我想知道你们是否可以帮助我,因为我现在至少挣扎了两个小时,而且我不知道如何正确地做到这一点。 它应该是这样的:

(字母数)-(具有这么多字母的单词数)
2 - 1
3 - 4
5 - 1
等等

char tab[1000];
int k = 0, x = 0;

printf("Enter text: ");
fgets(tab, 1000, stdin);

for (int i = 2; i < (int)strlen(tab); i++)
{


    for (int j = 0; j < (int)strlen(tab); j++)
    {
        if (tab[j] == '\0' || tab[j]=='\n')
            break;
        if (tab[j] == ' ')
            k = 0;
        else k++;

        if (k == i)
        {
            x++;
            k = 0;
        }
    }
    if (x != 0)
    {
        printf("%d - %d\n", i, x);
        x = 0;
        k = 0;
    }

}



return 0;

【问题讨论】:

  • 您是要计算每个单词的字母数还是所有单词的平均字母数?
  • @FiddlingBits 从所需的输出来看,它应该是 N 个字母的单词数,其中 N 从 1 递增。
  • @WhozCraig 感谢您破译它。 :-D
  • 嗨,我正在尝试找出给出的文本中有多少单词有例如 2 个字母等等。我真的不知道该怎么做
  • 旁注: strlen 必须在每次调用时扫描整个字符串。这是非常缓慢的。 tablen 的长度没有变化,所以我们可以缓存长度,只调用一次strlen。在fgets 之后,执行:int tablen = strlen(tab); 然后,将for 循环中的(int)strlen(tab) 调用更改为tablen。这将大大加快速度。

标签: c c-strings word


【解决方案1】:

通过使用 两个 for 循环,您正在执行 len**2 字符扫描。 (例如)对于长度为 1000 的缓冲区,而不是 1000 个字符比较,您正在进行 1,000,000 次比较。

如果我们使用字长直方图数组,这可以在单个 for 循环中完成。

基本算法和你的内循环一样。

当我们有一个非空格字符时,我们增加一个当前长度值。当我们看到一个空格时,我们将直方图单元格(由长度值索引)增加 1。然后我们将长度值设置为 0。

下面是一些有效的代码:

#include <stdio.h>

int
main(void)
{
    int hist[100] = { 0 };
    char buf[1000];
    char *bp;
    int chr;
    int curlen = 0;

    printf("Enter text: ");
    fflush(stdout);

    fgets(buf,sizeof(buf),stdin);
    bp = buf;

    for (chr = *bp++;  chr != 0;  chr = *bp++) {
        if (chr == '\n')
            break;

        // end of word -- increment the histogram cell
        if (chr == ' ') {
            hist[curlen] += 1;
            curlen = 0;
        }

        // got an alpha char -- increment the length of the word
        else
            curlen += 1;
    }

    // catch the final word on the line
    hist[curlen] += 1;

    for (curlen = 1;  curlen < sizeof(hist) / sizeof(hist[0]);  ++curlen) {
        int count = hist[curlen];
        if (count > 0)
            printf("%d - %d\n",curlen,count);
    }

    return 0;
}

更新:

我真的不明白指针。有没有更简单的方法可以做到这一点?

指针是 C 库中一个非常重要的 [必不可少的] 工具,所以我希望你能尽快使用它们。

但是,转换for 循环很容易(删除char *bp;bp = buf;):

变化:

for (chr = *bp++;  chr != 0;  chr = *bp++) {

进入:

for (int bufidx = 0;  ;  ++bufidx) {
    chr = buf[bufidx];
    if (chr == 0)
        break;

for 循环的其余部分保持不变。

这是另一个循环 [但是,没有经过编译器优化] 双重获取字符:

for (int bufidx = 0;  buf[bufidx] != 0;  ++bufidx) {
    chr = buf[bufidx];

这是一个单行版本。请注意,这是推荐的做法,因为 assignmentchrinside 是循环条件子句,但仅用于说明目的: p>

for (int bufidx = 0;  (chr = buf[bufidx]) != 0;  ++bufidx) {

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 2020-08-08
  • 2018-04-02
相关资源
最近更新 更多