Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2013, 01:50   #1
Chainik!
Форумчанин
 
Регистрация: 10.11.2008
Сообщений: 120
По умолчанию Подсчитать количество слов в строке

В чём ошибка?? Если между словами один пробел программа работает корректно. А если 5, 10 то уже нет.
Код:
#include "stdafx.h"
#include "iostream"
#include "conio.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	const int n = 100;
	int count = 0;
	char *p = NULL;
	char s[n] = "Hello                  word            hello             word";
	p = s;
	while(*p)
	{
		while(*p != ' ' && *p)
			p++;
                count++;
		p++;
	}
	cout << s << "\n\nKolichestvo slov v stroke: " << count;
    _getch();
	return 0;
}
помог - жми на весы

Последний раз редактировалось Chainik!; 25.08.2013 в 23:50.
Chainik! вне форума Ответить с цитированием
Старый 25.08.2013, 02:19   #2
Degemot
 
Регистрация: 13.03.2013
Сообщений: 3
По умолчанию

*это у него с++
Degemot вне форума Ответить с цитированием
Старый 25.08.2013, 08:31   #3
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

А вам по заданию нужно использовать именно массив символов? Если нет, то лучше написать программу с использованием string.

В книге "Язык программирования C" Кернигана и Ритчи есть вот такой пример. Программа считывает входной поток и выводит: "количество строк", "количество слов" и "количество символов"

Код:
#include <stdio.h>

#define IN   1  /* inside a word */
#define OUT  0  /* outside a word */

/* count lines, words, and characters in input */
main() {
    int c, nl, nw, nc, state;

    state = OUT;
    nl = nw = nc = 0;
    while ((c = getchar()) != EOF) {
        ++nc;
        if (c == '\n')
            ++nl;
        if (c == ' ' || c == '\n' || c == '\t')
            state = OUT;
        else if (state == OUT) {
            state = IN;
            ++nw;
        }
    }
    printf("nLines = %d, nWords = %d, nChars = %d\n", nl, nw, nc);
}
Так нужны примеры с использованием STL C++?

Последний раз редактировалось 8Observer8; 25.08.2013 в 11:09.
8Observer8 вне форума Ответить с цитированием
Старый 25.08.2013, 14:53   #4
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Можно строку разбить на токены и посчитать кол-во этих токенов.
Igor95 вне форума Ответить с цитированием
Старый 25.08.2013, 15:33   #5
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

http://ideone.com/XvIZRC

Код:
#include<iostream>
using namespace std;
 
size_t GetNumberOfWords(const char* text)
{
    size_t count = 0;
 
    while(*text)
    {
        //перематываем все пробельные символы
        while(*text && isspace(*text) ) ++text;
 
        //если перемоталась вся строка - закончить работу
        if(!(*text) ) break;
 
        //если мы здесь, значит мы наткнулись на "слово"
        //увеличиваем счетчик слов, и перематываем его
        ++count;
        while(*text && !isspace(*text) ) ++text;
        }
    return count;
}
 
int main()
{
    enum { eSIZE = 100};
    const char test1[eSIZE] = "  Hello                  word            hello             word";
    const char test2[eSIZE] = "Hello                  word            hello             word";
    const char test3[eSIZE] = "Hello word hello word";
    const char test4[eSIZE] = "Hello word hello word  ";
        
    cout<<'\n';
    cout<<"WELCOME TO TEST OF FUNCTION size_t GetNumberOfWords(const char* text); \n";
 
    cout<<"source text :"<<test1<<endl;
    cout<<"number of words in the text = "<< GetNumberOfWords(test1)<<endl<<endl;
 
        cout<<"source text :"<<test2<<endl;
    cout<<"number of words in the text = "<< GetNumberOfWords(test2)<<endl<<endl;
 
    cout<<"source text :"<<test3<<endl;
    cout<<"number of words in the text = "<< GetNumberOfWords(test3)<<endl<<endl;
 
    cout<<"source text :"<<test4<<endl;
    cout<<"number of words in the text = "<< GetNumberOfWords(test4)<<endl<<endl;
 
    cout<< "THE CORRECT RESULT SHOULD BE: 4 WORDS\n";
    
    return 0;
}

Последний раз редактировалось _Bers; 25.08.2013 в 15:40.
_Bers вне форума Ответить с цитированием
Старый 25.08.2013, 16:10   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Гроза форумов Посмотреть сообщение
Нужно сначала удалить из строки все повторяющиеся разделители.
...
просто по пробелам не прокатит, я бы единицу влепил за такое.
Я бы единицу влепил тому, кто стал бы что либо удалять из строки, или бить её на токены.
_Bers вне форума Ответить с цитированием
Старый 25.08.2013, 17:38   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Код:
for (uint i = 0; i < len - 1; ++i)
 if ( isspace(str[i])  &&  !(isspace(str[i + 1])) )   //Если предыдущий символ - пробел, а этот - не пробел, то началось слово
  ++count;
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 25.08.2013, 22:39   #8
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Да, точно, исходную строку менять нельзя... спасибо, что поправили!))
Как вариант:
Код:
#include <iostream>

class CStringFacility
{
private:
	size_t m_charsAmount;
	char *m_pCharArray;
public:
	CStringFacility(const char* _charArray)
	{
		// checking whether the length of the passed string is valid
		//_ASSERT(strlen(_charArray) > 256);
		m_charsAmount = strlen(_charArray);
		m_pCharArray = new char[m_charsAmount + 1];
		strncpy(m_pCharArray, _charArray, m_charsAmount + 1);
		std::cout << "m_pCharArray: " << m_pCharArray << std::endl;
	}
	~CStringFacility()
	{
		delete []m_pCharArray;
	}
	const int countWords(const char* _delimArray);
};
const int CStringFacility::countWords(const char* _delimArray)
{
	const int delimsAmount = strlen(_delimArray);
	bool isDelimFaced = false;

	int wordsAmount = 0;

	size_t i = 0;
	// checking the first symbol
	if (m_pCharArray[i] != '\0')
	{
	     // looking for the delim within the string
	     for (int j = 0; j < delimsAmount && !isDelimFaced; j++)
	     {
		      if (m_pCharArray[i] == _delimArray[j])
			      isDelimFaced = true;
	     }
	     if (!isDelimFaced)
		     wordsAmount++;
	}
	else return wordsAmount;
	// the second step of string parsing
	i++;
	while (i <= m_charsAmount)
	{
		// looking for the delim within the string
		for (int j = 0; j < delimsAmount && !isDelimFaced; j++)
		{
			if (m_pCharArray[i] == _delimArray[j])
				isDelimFaced = true;
		}
		if (isDelimFaced)
		{
			// if delim is found, we check if the following symbol is not the delim
			i++;
		    for (int j = 0; j < delimsAmount && isDelimFaced; j++)
			{
				if (m_pCharArray[i] != _delimArray[j])
				    isDelimFaced = false;
			}
			if (!isDelimFaced)
				// if no delim was run into, then we ran into the new word
				wordsAmount++;
		}
		i++; // going to the next word
	}
	return wordsAmount;
}

// client code
int main()
{
	using namespace std;
	char testString[50] = "What !have you done";
	CStringFacility facilityObject(testString);
	cout << facilityObject.countWords(" !") << endl;
	system("pause");
}
Igor95 вне форума Ответить с цитированием
Старый 25.08.2013, 23:52   #9
Chainik!
Форумчанин
 
Регистрация: 10.11.2008
Сообщений: 120
По умолчанию

Кто нибудь ответит какие у меня косяки в программе?? Нужно прогу написать через посимвольную обработку.
помог - жми на весы
Chainik! вне форума Ответить с цитированием
Старый 26.08.2013, 01:02   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Chainik! Посмотреть сообщение
Кто нибудь ответит какие у меня косяки в программе?? Нужно прогу написать через посимвольную обработку.
Вот это один большой косяк:

Код:
while(*p)
	{
		while(*p != ' ' && *p)
			p++;
                count++;
		p++;
	}
Во-первых: не учитывает, что строка изначально может начинатся с пробельных символов.
Во-вторых: не учитывает, что слова в строке могут разделяться сразу же несколькими пробельными символами, идущими один за другим.
В третьих: пробельные символы это не только ' '

Последний раз редактировалось _Bers; 26.08.2013 в 01:08.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подсчитать количество слов в предложении Sv. Microsoft Office Excel 2 04.01.2013 00:16
Ввести с клавиатуры строку. Посчитать количество слов в строке. Определить, что является разделителем слов. Вывести рез-ть на экра Газимов Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 02.03.2012 15:58
В предложении подсчитать количество слов. Delphi King21 Помощь студентам 4 16.03.2011 14:26
Подсчитать количество слов и количество букв MDSIQ Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 13.11.2010 16:57
подсчитать количество символов слов и предложений nev Помощь студентам 4 09.06.2007 21:22