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

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

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

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

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

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

В чем ошибка?? Ругается на строку с функцией strcmp. Как исправить
Код:
#include "stdafx.h"
#include "iostream"
#include "conio.h"
using namespace std;
const int n = 100;
//-----------------------------------------------------------------
bool same_word(char *s)
{
	for(int i = 0; i < strlen(s); i++)
	{
		bool b = true;
		for(int j = i + 1; j < strlen(s); j++)
		{
			if(stcmp(s[i],s[j]))
				b = false;
		}
		if(!b)
			return true;
	}
	return false;
	
}
//-----------------------------------------------------------------
int _tmain(int argc, _TCHAR* argv[])
{
	char s[n] = "Hello word my name is", *p;
	int count = 0;
	/*cout << "Vvedite stroku: ";
	gets(s);*/
	p = strtok(s, " ");
	while(p)
	{
		if(same_word(p))
			count++;
		p = strtok(NULL," ");
	}
	cout << "\n\nKolichestvo odinakovix slov: " << count;
	_getch();
	return 0;
}
помог - жми на весы

Последний раз редактировалось Stilet; 31.08.2013 в 20:27.
Chainik! вне форума Ответить с цитированием
Старый 31.08.2013, 13:42   #2
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Первое что режет глаз. Отсутствие хэдэр файла для работы со строками.
Код:
#include <cstring>
Не
Код:
if(stcmp(s[i],s[j]))
может вы имели в виду
Код:
if(strcmp(s[i],s[j]))
Зачем указывать размер строки (n)
Код:
char s[n] = "Hello word my name is",
напишите
Код:
char s[] = "Hello word my name is";
и все...
Еще к вам вопрос, что вы передаете в функцию
Код:
same_word(p)
.... по вашей задумке... ?????
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Bugrimov; 31.08.2013 в 13:51.
Bugrimov вне форума Ответить с цитированием
Старый 31.08.2013, 13:48   #3
Chainik!
Форумчанин
 
Регистрация: 10.11.2008
Сообщений: 120
По умолчанию

Всё равно ругается компилятоор
помог - жми на весы
Chainik! вне форума Ответить с цитированием
Старый 31.08.2013, 14:50   #4
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

В strcmp требуется передавать адрес, а не значение.
s[i] - значение типа char.
s[i] годилось бы, если бы s было указателем на указатель. Тогда s[i] было бы адресом, хранящимся в указателе, на который указывает s.


&s[i] - указатель, т.е адрес, указывающий на ячейку памяти, где хранится значение типа char.
Только вот &s[i] - не строка. А функция strcmp будет искать символ окончания строки. Т.е передавать &s[i] в качестве параметра туда, где требуется строка небезопасно.

Подумайте, даже само имя функции strcmp говорит о том, что нужно передать адреса начала строк.

___________________________________ ___________________________________ __________

Да, и программа у вас на C, а подключается библиотека C++ - iostream. Компилятору-то все равно, а вот программистов этот факт будет смущать.
___________________________________ ___________________________________ __________

Насчет
Код:
if (strcmp(pFirstString, pSecondString))
Возвращаемое значение этой функции - 0, если строки равны. Т.е для if выполнится false.
Возвращаемое значние > 0, если первая строка больше второй. Т.е для if выполнится true.
Возвращаемое значение < 0, если вторая строка больше первой. Т.е для if выполнится true.

Последний раз редактировалось Igor95; 31.08.2013 в 15:08.
Igor95 вне форума Ответить с цитированием
Старый 31.08.2013, 14:54   #5
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Цитата:
Еще к вам вопрос, что вы передаете в функцию
Код:


same_word(p)

.... по вашей задумке... ?????
2Bugrimov: strtok(char*, const char*) возвращает указатель на char.

P.S - хотел прикрепить это сообщение к своему предыдущему. Проблема в том, что не пойму, как удалить это сообщение.

Последний раз редактировалось Igor95; 31.08.2013 в 15:11.
Igor95 вне форума Ответить с цитированием
Старый 31.08.2013, 15:23   #6
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Цитата:
Сообщение от Igor95 Посмотреть сообщение
2Bugrimov: strtok(char*, const char*) возвращает указатель на char.

P.S - хотел прикрепить это сообщение к своему предыдущему. Проблема в том, что не пойму, как удалить это сообщение.
Передали вы указатель и что??????? Что с этим указателем должна делать функция.....
Кстати, в стандарт на Си уже входит булевый тип???????????? C++ и есть...
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Bugrimov; 31.08.2013 в 15:25.
Bugrimov вне форума Ответить с цитированием
Старый 31.08.2013, 16:10   #7
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Все, что нужно для решения задачи (в разумных пределах)
Или я чего-то не понял?
C не поддерживает ОО парадигмы
Igor95 вне форума Ответить с цитированием
Старый 31.08.2013, 17:50   #8
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Спрошу по другому
Код:
strlen(s)
- что возвращает функция????
Теперь мне все ясно!!!!!!!!!
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Bugrimov; 31.08.2013 в 19:32.
Bugrimov вне форума Ответить с цитированием
Старый 31.08.2013, 18:05   #9
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Цитата:
Сообщение от Bugrimov Посмотреть сообщение
Спрошу по другому
Код:
strlen(s)
- что возвращает функция????
Длину строки.
strlen(const char*) - требует указатель на char. Константа s является адресом начала массива и хранит его адрес. При передаче s в качестве аргумента компилятор неявно приводит его к указателю. Поэтому все будет отлично работать.

Последний раз редактировалось Igor95; 31.08.2013 в 18:08.
Igor95 вне форума Ответить с цитированием
Старый 31.08.2013, 19:25   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <map>

using namespace std;

int
main()
{
    string sentence = "Hello word my name is word Word";
    istringstream iss(sentence);
    map<string, int> words;
    for_each(istream_iterator<string>(iss), istream_iterator<string>(), [&words](string i) {++words[i];});
    for_each(words.begin(), words.end(), [](pair<const string, int> &i) {cout << i.first << " - " << i.second << endl;});
}
C++11
Правда, я не понял, что значит "Подсчитать количество одинаковых слов в строке". Влияет ли одинаковый регистр или нет? По вышеприведенному коду получается, что если слово встречалось ранее, то нужно увеличить счетчик одинаковых слов, т.е., например, в строке "привет привет" 1 одинаковое слово.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчитать количество слов в строке Chainik! Общие вопросы C/C++ 31 10.04.2016 01:55
Подсчет одинаковых слов в строке versegg Помощь студентам 0 27.05.2012 19:39
Количество одинаковых слов в строке. Delphi topside Помощь студентам 10 30.10.2011 23:05
Подсчитать количество слов и количество букв MDSIQ Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 13.11.2010 16:57