Распознавание пробелов в тексте

Я пишу программу, которая расшифровывает предложения, слоги и слова, данные в основном текстовом файле.

Программа перебирает файл посимвольно. Сначала он проверяет, является ли это маркером конца предложения, например ! ? : ; или .. Затем, если символ не является пробелом или табуляцией, предполагается, что это символ. Наконец, он определяет, что если это пробел или табуляция, а последний символ перед ним был допустимой буквой / символом (например, не маркером конца предложения), то это слово.

Я немного не вдавался в подробности, но вот в чем проблема. Мое количество слов равно количеству моих предложений. Это означает, что слово останавливается, когда есть маркер конца предложения, НО настоящая проблема в том, что пробелы считаются допустимыми буквами.

Вот мое выражение if, чтобы решить, является ли рассматриваемый символ допустимой буквой в слове:

else if(character != ' ' || character != '\t')

К тому моменту в программе я уже исключил маркеры конца предложения. (В оригинале, если на самом деле). При чтении таблицы Ascii 32 должно быть пробелом. Однако, когда я вывожу все символы, которые попадают в этот блок кода, там есть пробелы.

Так что я делаю не так? Как я могу помешать пробелам пройти через это, если?

Заранее спасибо, и я чувствую, что вопрос может быть немного расплывчатым или плохо сформулированным. Если у вас есть вопросы или вам нужны разъяснения, дайте мне знать.


person Blackbinary    schedule 05.02.2010    source источник
comment
Ой! Используйте символьные литералы, чувак! Нет смысла делать код, и то и другое сложнее для чтения и зависимостью от набора символов. Примерно так _1 _... И используйте '\t' для табуляции.   -  person dmckee --- ex-moderator kitten    schedule 05.02.2010


Ответы (3)


Отмечу что

(character != 32 || character != 9)

всегда правда. потому что, если символ 32, это не 9, и истина ИЛИ ложь истинна ...

Вы, наверное, имеете в виду

(character != ' ' && character != '\t')
person dmckee --- ex-moderator kitten    schedule 05.02.2010
comment
&& вместо || исправил мою проблему, программа теперь работает так, как должна. Однако у меня есть еще одна проблема, и вы можете увидеть правку в исходном сообщении, чтобы узнать больше. - person Blackbinary; 05.02.2010
comment
@Thomas: Потому что это было в исходном коде и - обнаружив логическую ошибку и строковый литерал - я начал печатать и перестал думать. Основная ошибка вырезания и вставки. Спасибо. - person dmckee --- ex-moderator kitten; 06.02.2010

Вы не должны полагаться на фактические числа для символов: это зависит от кодировки, используемой вашей платформой, и может не быть ASCII. Вы можете проверить наличие какого-либо конкретного символа, просто проверив его. Например, чтобы проверить, является ли c пробелом:

if (c == ' ')

будет работать, его легче читать и он переносится.

Если вы хотите пропустить все пробелы, вы должны использовать #include <ctype.h>, а затем isspace():

if (isspace((unsigned char)c))

Изменить: как говорили другие, ваше условие для проверки "не пробел" неверно, но вышеуказанный пункт все еще применяется. Итак, ваше состояние можно заменить на:

if (!isspace((unsigned char)c))
person Alok Singhal    schedule 05.02.2010
comment
Я подумал, что может понадобиться больше кода. Погодите, я попробую кое-что из предложенных (в основном && вместо ||) - person Blackbinary; 05.02.2010
comment
@Blackbinary: пожалуйста, посмотрите мое изменение: вам, вероятно, не понадобится больше кода, но вы все равно должны заменить свое условие на if (!isspace(...)). - person Alok Singhal; 05.02.2010
comment
ура за использование правильной библиотеки! - person rampion; 05.02.2010

Вероятно, было бы лучше просто сравнить с конкретными символами, которые вы считаете пробелами, также используйте &&:

if ((character != ' ') &&
    (character != '\t'))
person Mark Synowiec    schedule 05.02.2010
comment
Да, я знаю, что это верный способ. На самом деле я пробовал это раньше, чем другим способом. Но независимо от того, как я говорю ему избегать символов, которые являются пробелами или табуляциями, это не так. - person Blackbinary; 05.02.2010
comment
@Blackbinary: Потому что вы проверяете неправильную вещь: вы можете сделать: if (c != ' ' && c != '\t') и т. Д., И это сработает. - person Alok Singhal; 05.02.2010
comment
Я согласен с Алоком, я не думал о коде, но каждый символ всегда будет! = '' OR! = '\ T'. Я обновлю свой код, не заметил этой проблемы - person Mark Synowiec; 05.02.2010