C++: Число слов в строке

Пользователь вводит строку, нужно посчитать, сколько в ней слов.

Слова разделяются пробелами, значит, достаточно посчитать их количество, но пробелов всегда на 1 меньше, чем слов (исключая случай когда пробел стоит на конце строки), поэтому хорошо бы прибавить к числу пробелов единичку.

Реализация:

#include "stdafx.h"

#include <stdio.h>
#include <locale.h>
#include <math.h>
#include <string.h>

int main()
{
    char myString[40];
    puts("Vvedyte stroku: ");
    gets(myString);
    int space=0;
    for (int i =1; i<=strlen(myString); i++)
    {
        if (myString[i] == ' ')
        {
            space = space+1;
        }
    }
    printf("chislo slov ravno %d\n", space+1);
}

В коде мы бежим по символам строки и смотрим не пробел ли это — если так, то увеличиваем количество на 1. Можно реализовать функцию для проверки такого:


int WordCount(char S [])
{
    int space=0;
    for (int i = 1; i<= strlen(S); i++)
    {
        if (S[i] == ' ')
        {
            space++;
        }
    }
    return space+1;
}

Принимает строку, возвращает количество слов.

10 Responses

    • Pyatnitsev 10.12.2011 / 21:09

      А можете что-нибудь предложить конкретное по оптимизации? Пара вариантов у меня есть, но здесь они не являются необходимостью, так как программа маленькая и учебная.

  1. Kopeicev 10.12.2011 / 21:22

    Привет!
    Потроллю, быдлокод :)
    1. int main() — воздержусь комментировать такое объявление main’а.
    2. char myString[40]; — а почему строка юзера не может быть больше 40 символов? Бред…
    3. puts(«Vvedyte stroku: «) — ну локализацию бы чтоли выбрал :)
    4. Если ты заявляешь, что код плюсовый, так и объявляй счётчик цикла по плюсовому: не int i; for (i=…, а for (int i =…

    • Pyatnitsev 10.12.2011 / 21:36

      О! Привет =)

      1. Чем тебе он не понравился? тебе давай аргументы строки командной? Нафига?
      2. Это так, просто потому, что мои одногруппники (да и читатели) могут не знать динамической памяти. Как выделять и пользовать.
      3. Можно и локализировать — в некоторых программах тут я это делал:
      #include
      setlocale(LC_ALL, Russian»»); примерно так.
      4. Внутри функции это именно так. В коде я править не стал. Допустимо и то и то, однако, ты прав — лучше переменную оборачивать внутрь.

    • Григорий 11.12.2011 / 01:00

      Введу Вас в курс дела:был зачет,с ограничением по времени
      Отсюда:
      «puts(«Vvedyte stroku: «) – ну локализацию бы чтоли выбрал :)«-возможно человек торопился и ему не setlocale’ов и прочей мелочи
      «char myString[40];» — возможно просто специфичное условие задачи
      «Если ты заявляешь, что код плюсовый, так и объявляй счётчик цикла по плюсовому: не int i; for (i=…, а for (int i =…«-наверное тема больше для холиваров:D не уверен,что нативно он в плюсах появился раньше,чем в 99ом Си.

  2. andybond 10.12.2011 / 23:18

    Нормальная программа. Не говорю, что предел совершенства, но соотносимо с целями и задачами она написана правильно.

  3. Олег 07.07.2013 / 21:02

    А если в строке 2 или 3 пробела?:)
    Программа будет считать слова которые не существуют.

Добавить комментарий