Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа со строками в си

11K
16 июня 2008 года
coolcoder
39 / / 14.08.2006
Помогите пожалуйста понять логику работы функции strtok языка си!
Допустим, у меня есть код:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#incldue <string.h>
char str[80];
char terms[]="'!;:,.?- ";
char res=NULL;
int word_count;
int main()
{
clrscr();
puts("Введите строку:n\");
scanf("%s", str);
res=strtok(str, terms);
while(res!=NULL)
{
word_count++;
res=strtok(NULL, terms);
}
printf("Слов в предложении %i штук.", word_count);
getch();
return 0;
}

По идее и согласно моему здравому смыслу если ввести строку, состоящую из нескольких слов, разделенных пробелами либо другими символами, из которых состоит строка terms, то в результате работы программы будет выведено количество слов в предложении, однако всегда она говорит, что слов в предложении одна штука! Помогите пожалуйста разобраться, помогите исправить так, чтобы считало количество слов в предложении! Очень надеюсь на вашу помощь! Заранее благодарен!
26K
16 июня 2008 года
GoreNJ
33 / / 02.09.2007
Очень интересная функция, раньше с ней не сталкивался. Классическим методом втыка переделал твой код. Теперь работает:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
char str[80] = "In this row,some words";
char terms[]="'!;:,.?- ";
char *res=NULL;
int word_count;
int main()
{
res=strtok(str, terms);
while(res!=NULL)
{
word_count++;
res=strtok(NULL, terms);
}
printf("There are %d words!", word_count);
getch();
return 0;


Для простоты отладки я сделал заданную зараннее строку.

Вобщем ошибка была только в обьявлении переменной res. Она поочерёдно принимает значения каждого слова, поэтому инициализация должна выглядеть как *res. Вот и фсё.
11K
16 июня 2008 года
coolcoder
39 / / 14.08.2006
GoreNJ, большое спасибо за помощь! Но только что столкнулся с [COLOR="Red"]###[/COLOR] : если строка наперед задана, то есть
 
Код:
char str[80] = "In this row,some words";

то всё замечательно работает и считает слова, но если вводить строку с клавы
 
Код:
char str[80] = "In this row,some words";

то результат опять то т же самый: одно слово в предложении и всё тут! Как быть?

[COLOR="Red"]Маты ни в каком виде не использовать,следующий раз отправлю отдыхать[/COLOR]. модератор.
26K
16 июня 2008 года
GoreNJ
33 / / 02.09.2007
Да, действительно. Но выход опять же имеется. В С++ есть множество способов ввода-вывода. Мне кажется, такой метод ввода строки в чём-то ошибочен. Но зато работает следующая функция:
 
Код:
gets(str);
11K
16 июня 2008 года
coolcoder
39 / / 14.08.2006
Спасибо огромное!!!
11K
19 июня 2008 года
coolcoder
39 / / 14.08.2006
Товарищи, мне срочно срочно требуется ваша помощь! Теперь у меня есть код, который сортирует слова в предложении по алфавиту, но там все написано сплошняком:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
char str[80];
char terms[]="'!;:,.?- ";
char* res;
char* item;
char s[80][80];
char sort_arr[80][80];
int word_count;
int i, j;
int main()
{
    clrscr();
    puts("Ввкдите строку:\n");
    fgets(str, sizeof(str), stdin);
    puts("Исходные слова:\n");
    res=strtok(str, terms);
    while(res!=NULL)
    {
        strcpy(sort_arr[word_count], res);
        printf("\n%i:\t%s", word_count+1, sort_arr[word_count]);
        word_count++;
        res=strtok(NULL, terms);
    }
    printf("\n\nСлов в предложении %i штук\n", word_count);
    ///////////////////////////////////////////////////////
    for(i=1; i<word_count; i++)
    {
        strcpy(item, sort_arr);
        j = i;
        while(strcmp(item, sort_arr[j-1])<0)
        {
            strcpy(sort_arr[j], sort_arr[j-1]);
            j--;
        }
        strcpy(sort_arr[j], item);
    }
    puts("\nОтсортированные слова:");
    for(i=0; i<word_count; i++)
    {
        printf("\n%i:\t%s", i+1, sort_arr);
    }

    getch();
    return 0;
}

Так вот теперь мне нужно переписать этот код в процедурном стиле, чтобы каждое отдельное действие было записано в виде процедуры (ввод предложения, разбитие его на слова, сортировка слов, вывод результата). Пробовал переписывать сам - прога компилится и работает, но совершенно неправиль и не так, как до моих преобразований кода. Помогите пожалуйста с этим, очень вас прошу!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог