|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Количество слов в предложении
Мне нужно решить задачу, в которой нужно подсчитать количество слов в предложении. Я решил это сделать при помощи функции 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
|
||||
|
||||
Ну вопервых tokenPtr = strtok(NULL, " "); ничего вам не даст. Икать пробел надо в строке, так как вы это делали выше tokenPtr = strtok(s, " ");
Во вторых, вы ничего не делаете со строкой в цикле и будет цикл у вас поэтому крутится до бесконечности. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
Вместо scanf("%s", s); используйте
Код:
fgets(s, 250, stdin); Цитата:
|
#4
|
|||
|
|||
То есть как это в строке? Вот так
Код:
while(strtok(s, " ") != NULL |
#5
|
|||
|
|||
Ничего не делайте, просто замените
Код:
scanf("%s", s); Код:
fgets(s, 250, stdin); |
#6
|
||||
|
||||
Код:
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
|
|||
|
|||
Ваша программа выполняется не для всех значений.
|
#8
|
||||
|
||||
Например, для каких не выполняется?
<слово><пробел>(<пробел>)*<слово> - выполняется. <слово><конец строки> - выполняется. <слово><пробел><конец строки> - выполняется. Все комбинации описанных правил тоже выполняются. Однобуквенные слова обрабатываются верно. Тестил на строках Код:
"hello world"; "hello g world"; "hello g world"; "hello g world shshs"; "hello g world shshs "; jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 25.06.2013 в 19:44. |
#9
|
||||
|
||||
Пардон если слишком толсто, зато работает, тестил, вроде ошибок нет.
Код:
#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. |
#10
|
|||
|
|||
Цитата:
|
#11
|
||||
|
||||
Более оптимизированный и правильный с точки зрения задачи код (слово все-таки это не символ, поэтому это минимум 2 символа).
Код:
#include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <string.h> #define SIZE 255 int Words_Count(char *buff) { int word = 0; // количество слов int i = 0; // итератор int c = 0; // счетчик символов для определения слова /* нужно для правильной работы цикла */ if (!isspace(strlen(buff))) // последний символ не пробел? buff[strlen(buff)] = ' '; // нет, вносим пробел for (i = 0; i < strlen(buff); i++) { // Если не пробел, считаем количество символов if (!isspace(buff[i])) c++; // если пробел else if (isspace(buff[i])) { // более двух символов значит слово, // подсчитываем и сбрасываем счетчик if (c >= 2) word++; c = 0; } } return word; } main () { // Выделяем память и заполняем нулями char *buff = (char*)calloc(SIZE, sizeof(char)); if (!buff) printf("Not enough memory"); // считываем строку gets_s(buff,SIZE); printf("So, we have the %d words", Words_Count(buff)); getchar(); return 0; } Последний раз редактировалось orion_asm, 30.07.2013 в 04:42. |
#12
|
||||
|
||||
Цитата:
Цитата:
Да, я некропостер. Ток все равно ветка форума полудохлая. jmp $ ; Happy End! The Cake Is A Lie. |
#13
|
||||
|
||||
Цитата:
*** А, понял что вы имели в виду - если ввести "а" или "б". Ну да, можно "допилить" алго, если соответствующее условие будет в задаче. Исходил из того, что слово есть набор как минимум 2 любых символов. Последний раз редактировалось orion_asm, 09.08.2013 в 02:35. |
#14
|
||||
|
||||
Я имел в виду, что по правилам русского языка в предложении "Книга лежит в шкафу" четыре слова. Поэтому дополнительно поставленное условие "минимум 2 символа" приведет к невыполнению условия изначального задания "подсчитать количество слов в предложении" (такой алгоритм не учтёт предлог "в").
Цитата:
Кстати сей код у меня регулярно падает. Дебажный gets_s забивает свободную часть строки байтами 0xFE, и естественно дописывание пробела на конце убивает строку. И еще немного багии: Цитата:
Все эти баги из-за приведенной выше строки. И напоследок, мои любимые упоротые бенчмарки. Тот код, что я кидал раньше, с небольшой правкой в начале, и поправленный код orion_asm (добавление пробела на конец вынес отдельно, чтоб не править строку постоянно), миллион повторений, время в тиках (GetTickCount), релиз-сборка VS2012. Цитата:
jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 09.08.2013 в 11:52. |
#15
|
||||
|
||||
Цитата:
[/quote] |