Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Chernobyl
214 / 214 / 67
Регистрация: 30.09.2012
Сообщений: 545
#1

Неполадки с isalpha - C++

25.08.2013, 20:36. Просмотров 709. Ответов 11
Метки нет (Все метки)

Ниже я привел код самой функции.
Суть в том, что я хочу открыть файл и прочитать с него только цифры,английские буквы,разделители и знаки пунктуации.То есть если символ являеться таковым, он заноситься в вектор и будет в дальнейшем использован.

Например в файле лежит дальнейшее - rjnjhst jcyjdfkb vtnfk? - все хорошо, но если там лежит строка вида «njkcnjt», то всё,прога вылетает с ошибками, что что-то больше равно -1 и меньше ровно 255 и всё.Если убрать проверку(тот if, то всё норм и там и там) То есть,как я сейчас понимаю, isalpha не ладит с символом « , из-за чего всё летит. Но я то и хочу использовать isalph'у для того,чтобы эти и подобные символы туда не попадали.

Если переписать код как в варианте 2,то всё уже норм,но теперь просто мучает вопрос - почему в первом варианте всё улетает?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    void read_from_file(){ //вариант 1
    
    ifstream open("ofile.txt");  
    string word;
    while(getline(open,word)){ 
        for(int i=0;i<word.size();i++){
            if( isalpha(word[i]) || isdigit(word[i]) || isspace(word[i]) || isprint(word[i]))
            text.push_back(word[i]);
        }
                for(int i=0;i<text.size();i++) 
            cout<<text[i]; }
        }
 
 
    void read_from_file(){//вариант второй,выкололи те символы
    
    ifstream open("ofile.txt");
    string word;
    while(getline(open,word)){ 
        for(int i=0;i<word.size();i++){
            if(word[i]!='«' && word[i]!='»'){ //вот эта строка новая
            if( isalpha(word[i]) || isdigit(word[i]) || isspace(word[i]) || isprint(word[i]))
            text.push_back(word[i]);
            }
        }
 
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2013, 20:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неполадки с isalpha (C++):

isalpha и isprint - C++
Какие символы в них входят. Если можно перечислите!!! Заранее спасибо!!!

Задача: функция isalpha () - C++
нужна помощь: проверить, если символ - латинский, то вернуть сиивол, преобразованный в верхний регистр, иначе тот же самый символ. нужно...

Аналог функции isalpha() (<cctype>) - C++
Здравствуйте) Я так понял, функция isalpha() не работает с русскими буквами(?), пришлось написать свою версию для работы с русскими...

Isalpha;isdigit неверное употребление функций? - C++
Программа выводит сначала цифры,затем буквы,затем ост.символы исходной строки. Не могу разобраться,что не так:(( help #include...

Найти с помощью функции isalpha слова с дефисом - C++
Доброго времени суток. Имеется ф-ция isalpha: bool isalpha_rus(char c) { return c &gt;= 'а' &amp;&amp; c &lt;= 'я' || c &gt;= 'А' &amp;&amp; c &lt;= 'Я' || c...

Есть ли аналог isalpha, только для string - C++
Добрый вечер! Как проверить, что введены только буквы, без символов, isalpha не прокатило:curtsy: , тока для символов cout&lt;&lt;&quot;enter a...

11
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.08.2013, 20:39 #2
Вот так попробуйте:
C++
1
isalpha((unsigned char)word[i])
1
Chernobyl
214 / 214 / 67
Регистрация: 30.09.2012
Сообщений: 545
25.08.2013, 20:45  [ТС] #3
alsav22, Если в первый вариант вставить Вашу строку всё хорошо, тот символ не заноситься в вектор,а соотвественно не выводиться на печать, и это хорошо,но в почему так? Насколько знаю, unsigned char больше
0
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
25.08.2013, 20:52 #4
что такое "text" в программе?
1
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.08.2013, 20:53 #5
Цитата Сообщение от Chernobyl Посмотреть сообщение
но в почему так?
Код символа больше 127 (такое же с русскими символами бывает), а char у вас (как, впрочем, и у меня, но не у всех) знаковый. В результате преобразований получается очень большое число, отсюда вылет.
2
Chernobyl
214 / 214 / 67
Регистрация: 30.09.2012
Сообщений: 545
25.08.2013, 21:02  [ТС] #6
Nekto, Оууу,сам только что заметил,что не скопировал толково, это вектор состоящий из char. Прошу прощения.

Добавлено через 7 минут
alsav22, Благодарю, может еще сможете сказать. Я хочу, чтобы если в файле был введен энтер(то есть есть символ перехода на новую строку), то и вывести на печать тоже с энтером, а не всё в одну строку. Но как считать символ энтера,то есть понять,что в файле есть энтер.
С гугла узнал, что это и /n и /p,но как-то не выходит у меня их выследить.
0
castaway
Эксперт С++
4915 / 3023 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
25.08.2013, 21:04 #7
...
0
GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
25.08.2013, 21:10 #8
http://www.cplusplus.com/reference/cctype/
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.08.2013, 21:12 #9
Цитата Сообщение от Chernobyl Посмотреть сообщение
Я хочу, чтобы если в файле был введен энтер(то есть есть символ перехода на новую строку), то и вывести на печать тоже с энтером, а не всё в одну строку.
getline() читает до '\n' (или до конца файла), извлекает '\n' и отбрасывает. Можно самому добавлять в считанную строку '\n'.
1
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
25.08.2013, 21:21 #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <fstream>
#include <string>
 
std::string text;
void ReadFromFile()
  {
  std::ifstream file("ofile.txt");  
  char ch;
  while(file.good())
    {
    ch=file.get();
    if ( (ch>=32 && ch<127) || (ch>=9 && ch<=13) )
        text.push_back(ch);
    }
  }
 
int main()
  {
  ReadFromFile();
  for(size_t i=0;i<text.size();++i) 
    std::cout<<text[i]; 
  system("pause");
  return 0;
  }
1
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.08.2013, 21:22 #11
Цитата Сообщение от Chernobyl Посмотреть сообщение
Я хочу, чтобы если в файле был введен энтер(то есть есть символ перехода на новую строку), то и вывести на печать тоже с энтером, а не всё в одну строку.
После выхода из цикла, в котором добавляются символы в вектор, добавить в него '\n':
C++
1
text.push_back('\n');
1
Chernobyl
214 / 214 / 67
Регистрация: 30.09.2012
Сообщений: 545
25.08.2013, 21:42  [ТС] #12
alsav22, Да, работает,огромное спасибо! Теперь я немного лучше познал эту функцию и сам принцип действия кода.

Добавлено через 5 минут
Nekto, Не могу не выразить Вам также величайшую благодарность за Ваш труд. Особенно когда увидел, что Вы отредактировали свой изначальный код специально для энтеров.
Также большое спасибо!
0
25.08.2013, 21:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2013, 21:42
Привет! Вот еще темы с ответами:

Какой есть аналог isalpha для работы с русским алфавитом? - C++
Использую string и нужно проверять записан ли внутри текст или число. Какими средствами можно это сделать? Обычный isalpha(str.c_str())...

Удалить все символы в строке, не являющиеся буквами, используя функцию isalpha - C++
На Borland c\c++ .Спасибо

Неполадки с cin - C++
Доброго времени суток! Возникла небольшая проблемка с cin, самого процесса ввода просто не происходит. При отладке просто прохожу это...

неполадки в работе - C++
Доброго времени суток . Начну с самого начала . Моё железо состояло из : мать ABIT IS 7 , intel 4 3.00 память 2Gb видеокарта стояла старая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru