Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > C/C++ > C/C++
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.06.2013, 12:41
MahovIV MahovIV вне форума
Новичок
 
Регистрация: 30.12.2012
Сообщения: 77
Репутация: 10
По умолчанию Количество слов в предложении

Мне нужно решить задачу, в которой нужно подсчитать количество слов в предложении. Я решил это сделать при помощи функции strtok. Я не понимаю, почему программа не работает корректно?
Код:
#include <stdio.h>
#include <string.h>
#include <conio.h>

int main() {

	char s[250], *tokenPtr;
	int pr = 0;
	scanf("%s", s);
	tokenPtr = strtok(s, " ");
	while(tokenPtr!=NULL) {
		printf("%s\n", tokenPtr);
		tokenPtr = strtok(NULL, " ");
		pr++;
	}
	printf("%d\n", pr);
	getch();
	return 0;
}
В других примерах программа работала только при присваивании строке значения без ввода строки.
Ответить с цитированием
  #2  
Старый 25.06.2013, 12:48
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Ну вопервых tokenPtr = strtok(NULL, " "); ничего вам не даст. Икать пробел надо в строке, так как вы это делали выше tokenPtr = strtok(s, " ");
Во вторых, вы ничего не делаете со строкой в цикле и будет цикл у вас поэтому крутится до бесконечности.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 25.06.2013, 14:12
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

Вместо scanf("%s", s); используйте
Код:
fgets(s, 250, stdin);
Потому что scanf не предназначен для чтения строк с пробелами.


Цитата:
Ну вопервых tokenPtr = strtok(NULL, " "); ничего вам не даст. Икать пробел надо в строке, так как вы это делали выше tokenPtr = strtok(s, " ");
Во вторых, вы ничего не делаете со строкой в цикле и будет цикл у вас поэтому крутится до бесконечности.
Это C, так и должно быть
Ответить с цитированием
  #4  
Старый 25.06.2013, 14:15
MahovIV MahovIV вне форума
Новичок
 
Регистрация: 30.12.2012
Сообщения: 77
Репутация: 10
По умолчанию

То есть как это в строке? Вот так
Код:
while(strtok(s, " ") != NULL
? Что нужно делать со строкой в цикле?
Ответить с цитированием
  #5  
Старый 25.06.2013, 14:19
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

Ничего не делайте, просто замените
Код:
scanf("%s", s);
на
Код:
fgets(s, 250, stdin);
Ответить с цитированием
  #6  
Старый 25.06.2013, 14:27
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Код:
int len = strlen(s);
int count = 0;
for (int i = 0; i < len; ++i)
  if (s[i] == ' ')
  {
     ++count;
     do
       ++i;
     while (i < len && s[i] == ' ');
  }
if (s[len-1] != ' ')
  ++count;
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 25.06.2013 в 14:31.
Ответить с цитированием
  #7  
Старый 25.06.2013, 17:55
MahovIV MahovIV вне форума
Новичок
 
Регистрация: 30.12.2012
Сообщения: 77
Репутация: 10
По умолчанию

Ваша программа выполняется не для всех значений.
Ответить с цитированием
  #8  
Старый 28.06.2013, 19:31
Аватар для orion_asm
orion_asm orion_asm вне форума
Прохожий
 
Регистрация: 23.06.2012
Адрес: Украина, Днепропетровск
Сообщения: 19
Версия Delphi: XE3
Репутация: 10
По умолчанию

Пардон если слишком толсто, зато работает, тестил, вроде ошибок нет.
Код:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 255

/*	
    Подсчет слов. Словом считается минимум одна буква,
	которая окружена с обеих сторон как минимум одним
	пробелом
*/

int Words_Count(char *buff)
{
    int word = 0;
	int k = 0;
	// вычисляем длинну строки
	int len = strlen(buff);
	// последний символ не пробел?
	if (!isspace(buff[len]))
	// нет, вносим пробел
	buff[len] = ' ';
	// ввод начался с пробелов?
	if (isspace(buff[0]))
	{
		// считаем количество пробелов
		while (isspace(buff[k]))
		k++;
	}
	// счет от первого места, где закончились пробелы
	for (int i = k; i < SIZE; i++)
	{
		// встретили пробел?
		if (isspace(buff[i]))
		// надо же, еще один!
		if (isspace(buff[i+1]))
		// ищем не пробелы
		continue;
		// нашли не пробел, значит слово
		else word++;
	}
	return word;
}

int main ()
{
	// Выделяем память и заполняем нулями
	char *buff = (char*)calloc(SIZE, sizeof(char));
	// считываем строку
	gets_s(buff,SIZE);
           printf("So, we have the %d words", Words_Count(buff));
	getchar();
    return 0;
}

Последний раз редактировалось orion_asm, 28.06.2013 в 22:36.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter