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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2012, 23:19   #1
vrtp
Пользователь
 
Регистрация: 11.10.2011
Сообщений: 33
По умолчанию символьный ввод-вывод

Имеется такое задание:
Код:
/*Составить программу, которая выделяет отдельные слова из введенной пользователем строки. Словом считается последовательность букв, разделяемых одним или несколькими пробелами, табуляцией или знаками препинания.
Определить количество слов в строке.*/
В книге Кернигана и Ритчи написана уже готовая программа:
Код:
#include<stdio.h>
#define IN 1
#define OUT 0
int main(void)
{
int c, nw, state;
state=OUT;
nw=0;
while((c=getchar())!= EOF){
if (c == " " || c == "\n" || c == "\t")
state = OUT;
else if (state ==0){
state = IN;
++nw;
}
}
printf("%d\n",nw);
}
Вроде она будет работать, но функция getchar символьно забирает, а мне нужна строка, да и MVS не хочет компилировать, хотя пример из книги.
vrtp вне форума Ответить с цитированием
Старый 21.03.2012, 23:50   #2
Flame20
Пользователь
 
Регистрация: 21.03.2012
Сообщений: 14
По умолчанию

gets(str) считывает всю строку в char *str
Flame20 вне форума Ответить с цитированием
Старый 22.03.2012, 00:18   #3
vrtp
Пользователь
 
Регистрация: 11.10.2011
Сообщений: 33
По умолчанию

спасибо. то есть получается нужно создать символьный массив а вместо getchar поставить gets и все будет ок?
vrtp вне форума Ответить с цитированием
Старый 22.03.2012, 16:18   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

vrtp, у вас в программе ошибка!

Вместо:
Код:
if (c == " " || c == "\n" || c == "\t")
Нужно:
Код:
if (c == ' ' || c == '\n' || c == '\t')
Цитата:
Сообщение от vrtp Посмотреть сообщение
MVS не хочет компилировать, хотя пример из книги
Книга здесь не причём, читайте инструкцию: http://msdn.microsoft.com/ru-ru/library/bb384838.aspx

Цитата:
Сообщение от vrtp Посмотреть сообщение
или знаками препинания
Не понятно... То есть вот это два слова? Пример: two,word (без пробела, но через знак препинания).

Последний раз редактировалось 8Observer8; 22.03.2012 в 16:24.
8Observer8 вне форума Ответить с цитированием
Старый 22.03.2012, 17:34   #5
vrtp
Пользователь
 
Регистрация: 11.10.2011
Сообщений: 33
По умолчанию

Да, с кавычками немного зафэйлился. Да ваш пример показывает два слова, но еще есть цифры, которые как бы не относятся к словам, но главное, чтобы программа начала находить слова, а там уж доработаю
vrtp вне форума Ответить с цитированием
Старый 22.03.2012, 18:06   #6
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

То есть, вот это: win32 - не слово? Если в слове есть цифра, то это не слово?
8Observer8 вне форума Ответить с цитированием
Старый 23.03.2012, 18:27   #7
vrtp
Пользователь
 
Регистрация: 11.10.2011
Сообщений: 33
По умолчанию

нет это слово, а вот win 32 уже нет, ну или 1245 не слово, ну это как я понимаю задачу
vrtp вне форума Ответить с цитированием
Старый 24.03.2012, 09:42   #8
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

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

Если всё-таки словом считать любую последовательность символов, которая начинается с "не цифры", то нужно использовать функцию isdigit(c). Эта функция анализирует символ (int либо unsigned char, приведённый к int) и возвращает ненулевое значение (истина), если символ - цифра.

isdigit(c) --> http://cplusplus.com/reference/clibrary/cctype/isdigit/

Проблемы возникнут, если вы попытаетесь работать с кириллицей (isdigit(c) - не умеет с ней работать). Я сам не знаю, как решить. Может кто подскажет, как анализировать кириллицу (на простом примере или ссылкой)?

Последний раз редактировалось 8Observer8; 24.03.2012 в 09:45.
8Observer8 вне форума Ответить с цитированием
Старый 28.03.2012, 19:52   #9
vrtp
Пользователь
 
Регистрация: 11.10.2011
Сообщений: 33
По умолчанию

Ну ладно, упростим задачу. Словом считается набор символов, пофиг каких. Тогда по программе, которую я привел из КР. Сам алгоритм работает так: мы забиваем кучу символов, разделенные пробелами, например. Функцией getchar проходим через каждый символ и если встречаем пробел, ну или что-нить еще, то инкрементируем и дальше продолжаем идти, таким образом считаем слова. Или как-то иначе работает? Я просто пока понять не могу getchar забирает всю строку, которую я ввел или только один символ? Да и если все правильно почему при запуске программы консоль просто висит и заканчивать программу не хочет?
vrtp вне форума Ответить с цитированием
Старый 29.03.2012, 17:12   #10
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

А какая программа у вас висит. Покажите код.

А что значит:
Цитата:
Составить программу, которая выделяет отдельные слова из введенной пользователем строки
Вам нужно сохранять эти слова в массиве строк?

Чтобы понять, как работает программа, лучше всего её в пошаговом режиме выполнить.

Последний раз редактировалось 8Observer8; 29.03.2012 в 17:19.
8Observer8 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод-вывод Granus Общие вопросы C/C++ 1 29.05.2011 15:15
[C++] Ввод - вывод AquaticSoul Помощь студентам 0 18.04.2010 20:02
Ввод-Вывод Joker_35815 Помощь студентам 2 30.03.2010 19:22
Ввод-вывод Sparky Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 04.10.2009 13:15
Ввод и вывод Mihael-Vlz Паскаль, Turbo Pascal, PascalABC.NET 3 19.01.2009 18:00