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;
}

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

You may also like

10 комментариев

  • Елистрат
    10.12.2011 at 20:40

    Программа конечно неплохая, но вот оптимизация никакая >_>

    • Pyatnitsev
      10.12.2011 at 21:09

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

  • Kopeicev
    10.12.2011 at 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 at 21:36

      О! Привет =)

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

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

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

  • Kopeicev
    10.12.2011 at 22:40

    1. Потому что правила такие :)
    2. А что сложного? Указатель? char* myString; — всё.

  • andybond
    10.12.2011 at 23:18

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

  • Олег
    07.07.2013 at 21:02

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

LEAVE A COMMENT

Яндекс.Метрика