尝试查找不计空格的单词数

时间:2019-05-17 07:05:10

标签: c++

我正在尝试从用户输入中查找单词数,但由于用户可以输入一个字母和一堆空格,因此我被要求不要通过对空格进行计数来找到它,因此它将被计为数字

我已经尝试过计算空格数,但是我想不出另一种方法来计算单词数

char Array[100];
    {
        //variable declaration
        int words = 0;
        // input
        cout << "Enter string: ";
        cin.getline(Array, 100);
        // Number of words
        for (int i = 0; i < strlen(Array); i++)
        {
            if (Array[i] == ' ')
                words++;
        }
        cout << "Number of words in the string are: " << words + 1;
        cout << endl;
    }

我想用另一种方法来查找单词的数目,而不是通过空格来计算。感谢您的帮助。我是一个初学者,所以您不能使用复杂的方法来解决诸如getloc之类的问题。

3 个答案:

答案 0 :(得分:2)

您只需要计算空格字符后面紧跟着一个非空格字符的次数。

int firstNonSpace = 0;

while (Array[firstNonSpace] ==  ' ') //to skip spaces at the beginning of input
{
     firstNonSpace++;
}
for (int i = firstNonSpace; i < strlen(Array) - 1; i++) 
{
    if (Array[i] == ' ' && Array[i+1] != ' ')
        words++;
}

if(words || firstNonSpace == 0) 
     words++; //do not increment if the input is empty or only spaces.
cout << "Number of words in the string are: " << words;

请参见Live Demo

请注意,当输入超出数组的边界时,您将不得不处理这种情况,以免发生未定义的行为。

答案 1 :(得分:2)

最简单的方法是让标准库为您解析单词,例如:

#include <iostream>
#include <string>
#include <sstream>

int main () {
    //variable declarations
    std::string line, word;
    int words = 0;
    // input
    std::cout << "Enter string: ";
    std::getline(std::cin, line);
    // Number of words
    std::istringstream iss(line);
    while (iss >> word) {
        ++words;
    }
    std::cout << "Number of words in the string are: " << words << std::endl;
    return 0;
} 

如果您不想使用std::string(即,避免分配内存),则可以改为:

#include <iostream>
#include <algorithm>
#include <cctype>

int main() {
    //variable declarations
    char Array[100];
    int words = 0;
    // input
    std::cout << "Enter string: ";
    std::cin.getline(Array, 100);
    // Number of words
    char *ptr = Array;
    char *end = ptr + std::cin.gcount();
    while (ptr != end) {
        ptr = std::find_if(ptr, end, [](char c){ return !std::isspace(static_cast<unsigned char>(c)); });
        if (ptr == end) break;
        ptr = std::find_if(ptr+1, end, [](char c){ return std::isspace(static_cast<unsigned char>(c)); });
        ++words;
    }
    std::cout << "Number of words in the string are: " << words << std::endl;
    return 0;
}

或者,如果您想完全避免使用标准库算法:

#include <iostream>

int main() {
    //variable declarations
    char Array[100];
    int words = 0;
    // input
    std::cout << "Enter string: ";
    std::cin.getline(Array, 100);
    // Number of words
    char *ptr = Array;
    char *end = ptr + std::cin.gcount();
    while (ptr != end) {
        while ((*ptr <= ' ')) && (ptr != end)) ++ptr;
        if (ptr == end) break;
        ++ptr;
        while ((ptr != end) && (*ptr > ' ')) ++ptr;
        ++words;
    }
    std::cout << "Number of words in the string are: " << words << std::endl;
    return 0;
}

然后您可以将解析包装到帮助函数中以清理计数循环:

#include <iostream>
//#include <algorithm>
//#include <cctype>

bool findNextWord(char* &begin, char *end) {
    /*
    begin = std::find_if(begin, end, [](char c){ return !std::isspace(static_cast<unsigned char>(c)); });
    if (begin == end) return false;
    begin = std::find_if(begin+1, end, [](char c){ return std::isspace(static_cast<unsigned char>(c)); });
    return true;
    */
    while ((begin != end) && (*begin <= ' ')) ++begin;
    if (begin == end) return false;
    ++begin;
    while ((begin != end) && (*begin > ' ')) ++begin;
    return true;
}

int main() {
    //variable declarations
    char Array[100];
    int words = 0;
    // input
    std::cout << "Enter string: ";
    std::cin.getline(Array, 100);
    // Number of words
    char *ptr = Array;
    char *end = ptr + std::cin.gcount();
    while (findNextWord(ptr, end)) {
        ++words;
    }
    std::cout << "Number of words in the string are: " << words << std::endl;
    return 0;
}

答案 2 :(得分:0)

只需进行以下更改,鲍勃就是你的叔叔:)

if(array[i] == ' ') {
    continue;
}
words++;
while(array[i] != ' ') {
    i++;
}