C 数一数句子中有多少个单词-what';这是不对的

C 数一数句子中有多少个单词-what';这是不对的,c,C,我写了一个代码来计算一个句子中有多少个单词,但它在这样的情况下不起作用,例如: "hello world." 它需要返回2个单词,但由于空格的原因,它返回4个单词。它只适用于每个单词之间有一个空格的情况。这是我的代码: int counthowmanywordsinasentence(char sentence[])// help forfunc7 { int count = 0, i; for (i = 0;sentence[i] != '\0';i++) {

我写了一个代码来计算一个句子中有多少个单词,但它在这样的情况下不起作用,例如:

"hello    world."
它需要返回2个单词,但由于空格的原因,它返回4个单词。它只适用于每个单词之间有一个空格的情况。这是我的代码:

int counthowmanywordsinasentence(char sentence[])// help forfunc7
{
    int count = 0, i;

    for (i = 0;sentence[i] != '\0';i++)
    {
        if (sentence[i] == ' ')
            count++;    
    }
    return (count+1);
}

使用旗帜。如果遇到未设置空格和标志,请设置标志和增量计数。如果遇到空格并设置了标志,则忽略该情况。如果设置了标志&char(即句子[i])不是空格,则重置标志

使用标志。如果遇到未设置空格和标志,请设置标志和增量计数。如果遇到空格并设置了标志,则忽略该情况。如果设置了标志&char(即句子[i])不是空格,则重置标志

你必须先决定什么是单词:)让我们假设一个单词是至少有一个字母字符(a-Za-z)的任意字符序列。然后你可以按照@Abhilash的建议来完成你的代码

int wordcount(char *sentence) {
  int count = 0;
  int is_word = 0;

  int i;
  for(i=0; sentence[i]!='\0'; i++) {
    if(isalpha(sentence[i])) {
      is_word = 1;
    }
    if(sentence[i] == ' ' && is_word) {
      count++;
      is_word = 0;
    }
  }

  return count + is_word;
}

你必须先决定什么是单词:)让我们假设一个单词是至少有一个字母字符(a-Za-z)的任意字符序列。然后你可以按照@Abhilash的建议来完成你的代码

int wordcount(char *sentence) {
  int count = 0;
  int is_word = 0;

  int i;
  for(i=0; sentence[i]!='\0'; i++) {
    if(isalpha(sentence[i])) {
      is_word = 1;
    }
    if(sentence[i] == ' ' && is_word) {
      count++;
      is_word = 0;
    }
  }

  return count + is_word;
}

您可以安全地将
if
替换为此新版本:

if (sentence[i] == ' ' && sentence[i+1] != ' ')
这意味着您将只计算每个空间序列中的最后一个空间。因此,在4个连续空间的情况下,只计算最后一个

在这两种情况下,您仍然需要决定要做什么:

" hello world."
"hello world "

您需要知道在这两种情况下,这些词是否应算作2个或3个词。

您可以安全地将
if
替换为此新版本:

if (sentence[i] == ' ' && sentence[i+1] != ' ')
这意味着您将只计算每个空间序列中的最后一个空间。因此,在4个连续空间的情况下,只计算最后一个

在这两种情况下,您仍然需要决定要做什么:

" hello world."
"hello world "

因为你需要知道在这两种情况下,这些都应该算作2个或3个单词。

这是所有答案中最简单的,只需添加2行即可

#include <stdio.h>
int counthowmanywordsinasentence(char sentence[])// help forfunc7
{
    int count = 0, i;

    for (i = 0;sentence[i] != '\0';i++)
    {
        if (sentence[i] == ' ')
            count++;  
        while (sentence[i] == ' ')
            i++;     
    }
    return (count+1);
}
#包括
int counthowmanywordsinasentence(char语句[])//函数7的帮助
{
int计数=0,i;
对于(i=0;句子[i]!='\0';i++)
{
如果(句子[i]='')
计数++;
while(句子[i]='')
i++;
}
返回(计数+1);
}

这是所有答案中最简单的,只需添加两行即可

#include <stdio.h>
int counthowmanywordsinasentence(char sentence[])// help forfunc7
{
    int count = 0, i;

    for (i = 0;sentence[i] != '\0';i++)
    {
        if (sentence[i] == ' ')
            count++;  
        while (sentence[i] == ' ')
            i++;     
    }
    return (count+1);
}
#包括
int counthowmanywordsinasentence(char语句[])//函数7的帮助
{
int计数=0,i;
对于(i=0;句子[i]!='\0';i++)
{
如果(句子[i]='')
计数++;
while(句子[i]='')
i++;
}
返回(计数+1);
}

因此
sscanf
已经做了您需要的事情,它将在包含制表符的字符串之前吃掉任意数量的空格。此算法对于前导或尾随空格是安全的

int countHowManyWordsInASentence(char* sentence){
    int result = 0;
    int i = 0;

    while(sscanf(sentence, "%*s%n", &i) != EOF){
        sentence += i;
        result++;
    }
    return result;
}
sscanf
用途极其广泛,您可以轻松读出每个单词,如下所示:

int countHowManyWordsInASentence(char* sentence){
    int result = 0;
    int size = strlen(sentence);

    if(size > 0){
        char* word = (char*)malloc((size + 1) * sizeof(char));

        for(int i = 0; sscanf(sentence, "%s%n", word, &i) > 0; sentence += i){
            result++;
        }
        free(word);
    }
    return result;
}

因此
sscanf
已经做了您需要的事情,它将在包含制表符的字符串之前吃掉任意数量的空格。此算法对于前导或尾随空格是安全的

int countHowManyWordsInASentence(char* sentence){
    int result = 0;
    int i = 0;

    while(sscanf(sentence, "%*s%n", &i) != EOF){
        sentence += i;
        result++;
    }
    return result;
}
sscanf
用途极其广泛,您可以轻松读出每个单词,如下所示:

int countHowManyWordsInASentence(char* sentence){
    int result = 0;
    int size = strlen(sentence);

    if(size > 0){
        char* word = (char*)malloc((size + 1) * sizeof(char));

        for(int i = 0; sscanf(sentence, "%s%n", word, &i) > 0; sentence += i){
            result++;
        }
        free(word);
    }
    return result;
}

我不明白。。。你的“如果”如何可能?一句话[我]怎么可能值得“同时!”我的错,忘了在其中一个条件中添加“+1”我不明白。。。你的“如果”如何可能?一句话[我]怎么可能值得“同时!”糟糕,我忘了在其中一个条件中添加“+1”。代码的错误在于它计算的是空格,而不是单词。这就是为什么在返回之前需要添加1。但是像
“hello”
“world”
这样的字符串,每一个字符串都包含一个空格会发生什么呢?代码的错误在于它计算的是空格,而不是单词。这就是为什么在返回之前需要添加1。但是像
“hello”
“world”
这样的字符串,每一个字符串都包含一个空格,会发生什么情况呢?@TamarKravitz一旦遇到空格,它就会将其算作一个新词。但是while循环在剩余的空格上运行并跳过它。@BhargavRao类似地回答这个问题,它不能处理前导空格。如果需要的话,这个词也不能返回0。@TamarKravitz一旦遇到空格,它会将其作为新词计算。但是while循环在剩余的空格上运行并跳过它。@BhargavRao类似地回答这个问题,它不能处理前导空格。如果需要,这个函数也不能返回0。
isAlphabetic
已经实现,您只需要强制转换为
int
:而且这个函数从不计算最后一个字。不知道:p我习惯了C中没有太多可用的内容。还修改了代码以计算最后一个字(我觉得它很难看,但很有效).
isAlphabetic
已经实现,您只需将其转换为
int
:而且此函数从不计算最后一个单词。不知道:p我习惯C中没有多少可用的。还修改了代码以计算最后一个单词(我发现它很难看,但很有效)。类似于这方面的其他答案,这与前导空格有关,但此解决方案也无法计算最后一个单词。与其他答案类似,这与前导空格有关,但此解决方案也无法计算最后一个单词。