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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2013, 18:28   #1
Joose
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 67
По умолчанию Запись символов в массив

Всем привет. Возникла небольшая проблемка с вообщем-то простенькой программкой. Программа открывает файл с текстом, разбивает его на слова и выводит их на экран:
Код:
{
    int i = 0, j = 0;
    FILE *f;
    char buf[30], word[30];
    f = fopen(FileText, "r");
    while (!feof(f))
    {
        fscanf(f, "%s", buf);
        for(; buf[i] != '\0'; i++)
        {
            if(isalpha(buf[i]))                 /*Если текущий символ является буквой английского алфавита*/
            {                                   /*Записать его в буфер со словом*/
                word[j] = buf[i];               
                j++;
            }
        }
        word[j] = '\0';
        i = 0;
        j = 0;
        if(word[0] == '\0')                     /*Если в слове нет ни одного допустимого символа*/
        {
            continue;
        }
        printf("%s\n", word);
    }
    fclose(f);
    return 0;
}
Все отлично работает, за исключением одного: когда в файле встречается слово, в котором нет букв(а такое слово мне вообще не нужно), то программа не обрабатывает этот случай.
Например, в файле записан следующий текст:
I like to write 3" programm
В этом случае программа выведет на экран следующий текст:
I
like
to
write
ogramm

Подскажите, как это можно исправить?
Joose вне форума Ответить с цитированием
Старый 23.02.2013, 18:46   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Что-то я не оч. пойму где тут разбивка на слова...
Отладчиком проходил по программе?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.02.2013, 19:35   #3
Joose
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 67
По умолчанию

Функция считывает некий набор символов в массив buf. Затем она проверяет, является ли очередной символ буквой английского алфавита. Если да, то записывает его в новый массив word и печатает его.
Joose вне форума Ответить с цитированием
Старый 23.02.2013, 19:46   #4
alexander13
Форумчанин
 
Аватар для alexander13
 
Регистрация: 07.02.2013
Сообщений: 267
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Что-то я не оч. пойму где тут разбивка на слова...
Отладчиком проходил по программе?
fscanf читает до пробельного символа.

Upd.
Вообще, программа правильно работает. Ну, конечно, не считая некоторых моментов.. Но вот тестовая фраза нормально отрабатывается.
Μολὼν λαβέ

Последний раз редактировалось alexander13; 23.02.2013 в 19:50.
alexander13 вне форума Ответить с цитированием
Старый 23.02.2013, 19:54   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А, ну да...
Тогда так:
Код:
        fscanf(f, "%s", buf);
            int lew=0;
        for(; buf[i] != '\0'; i++)
        {
           if (isalpha(buf[i])){ 
               printf("%s\n", buf);        memset(buf,0,30); break;
           }
        }
...
не?

P.S. Поправился...
I'm learning to live...

Последний раз редактировалось Stilet; 23.02.2013 в 19:58.
Stilet вне форума Ответить с цитированием
Старый 23.02.2013, 20:00   #6
Joose
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 67
По умолчанию

Вместо
I
like
to
write
ogramm

программа должна выводить
I
like
to
write
programm

Т.е. если в тексте встречается слово из n символов, в котором нет ни одной буквы, то следующее слово будет обрезано на n букв сначала. Вот в этом-то и вся проблема. Подскажите пути решения, пожалуйста.

Цитата:
Сообщение от Stilet Посмотреть сообщение
А, ну да...
Тогда так:
Код:
        fscanf(f, "%s", buf);
            int lew=0;
        for(; buf[i] != '\0'; i++)
        {
           if (isalpha(buf[i])){ 
               printf("%s\n", buf);        memset(buf,0,30); break;
           }
        }
...
не?

P.S. Поправился...
Немного не понял этот код. Если первый символ это буква, то вывести массив и заполнить его нулями? Но ведь в массив может записаться и такое значение: Yellow. А с точкой оно уже не является словом.

Последний раз редактировалось Stilet; 23.02.2013 в 20:59.
Joose вне форума Ответить с цитированием
Старый 23.02.2013, 21:02   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ладно, первоначалный вариант:
Код:
        fscanf(f, "%s", buf);
        int lew=0,len;
        for(len=0; buf[len] != '\0'; i++,len++) lew+=(isalpha(buf[i]))?1:0;
        if (lew==len)     printf("%s\n", buf);      
        memset(buf,0,30);
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.02.2013, 11:30   #8
Joose
Пользователь
 
Регистрация: 16.10.2011
Сообщений: 67
По умолчанию

Спасибо большое, все понял.
Joose вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись произвольного числа символов в файл. геннадий522 Общие вопросы C/C++ 2 15.01.2013 05:01
Запись произвольного числа символов в файлю. геннадий522 Помощь студентам 2 14.01.2013 20:12
перевести массив символов в массив чисел rostik123 Общие вопросы C/C++ 2 15.11.2012 15:07
Запись координат в массив в реал тайм, Как записать координаты в массив Dark19 Visual C++ 2 21.06.2011 18:45
Как конвертировать массив символов в массив байт davinci C++ Builder 6 30.10.2010 18:09