Распознавание пробелов в тексте - PullRequest
2 голосов
/ 05 февраля 2010

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

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

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

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

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 05 февраля 2010

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

if (c == ' ')

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

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

if (isspace((unsigned char)c))

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

if (!isspace((unsigned char)c))
4 голосов
/ 05 февраля 2010

замечу, что

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

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

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

(character != ' ' && character != '\t')
0 голосов
/ 05 февраля 2010

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

if ((character != ' ') &&
    (character != '\t'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...