Как в с++ отделить символы. . .

wizard42

буквы алфавита от символов табуляции, новой строки и тд, в строке, записанной в массиве?

Zoulla

Что значит отделить?

wizard42

распознать, где буква, а где символ переноса или еще что. . .

ppplva

#include <ctype.h>
int isalpha(int c);

rosali

 #include <ctype.h> 

Перед тем как пользоваться этой замечательной библиотекой, рекомендуется 10 раз прочитать документацию, а потом все равно ею не пользоваться.
Во-первых,
char c = ...; isalpha(c)  
это просто ошибка, которая во многих реализациях приводит к assertion failed. А писать "правильно"
 isalpha(unsigned(c 
можно задолбаться. Какому дураку это вообще в голову пришло?! Там идея типа в том, что EOF=int(-1 и поэтому он может путаться с char(-1 ну вобщем кг/ам. Во-вторых, поведение этих функций зависит от локали, причем не очень ясно как именно.
К сожалению я не знаю, а чем же для этой задачи стоит пользоваться.

maggi14

написать самому за 5 минут

Olenenok

за 30 секунд, имея таблицу ascii под рукой.

Olenenok


bool IsAlpha (char code)
{
unsigned char Code = (unsigned char)code;
if ( (Code => 'a' && Code <= 'z') || (Code => 'A' && Code <= 'Z'
return true;
return false;
}

kokoc88

Ну теперь добавь туда русские символы, а затем тебе покажут где и как это работать не будет.

Olenenok

Ндась, афтар ничё про русские символы не сказал. Афтар, нужны русские символы?!

wizard42

я решил эту проблему по-другому

AVGO

bool IsAlpha (char code)
{
unsigned char Code = (unsigned char)code;
if ( (Code => 'a' && Code <= 'z') || (Code => 'A' && Code <= 'Z'
return true;
return false;
}
если уж писать в таком виде то это будет выглядеть так:
bool IsAlpha (char Сode)
{
return (Code => 'a' && Code <= 'z') || (Code => 'A' && Code <= 'Z');
}
кастить к unsigned не надо по причине того что коды у английских букв меньше 128, ну и if само собой не нужен )

Flack_bfsp

Во-вторых, поведение этих функций зависит от локали, причем не очень ясно как именно.
А что ж тут непонятного? Прелесть локалей в том, что пишешь в начале проги setlocale, и спокойно пользуешься isalpha, и возвращает она тебе то, что нужно. В противном случае тебе для каждой кодовой страницы придётся свою функцию писать.

rosali

что пишешь в начале проги setlocale
Я вообще-то очень редко сталкивался с ситуацией, когда у программы есть начало А ты? Если бы этот isalpha принимал идентификатор локали через параметр, я бы еще понял, а так эта идея просто нежизнеспособна. Ладно нет у меня сейчас сил подробнее объяснять...

Dasar

Ну, в начале функции установи locale
все-таки это лучше, чем изобретать велосипеды на пустом месте.

rosali

Ну, в начале функции установи locale
А как быть с MT? Неужели локаль per-тредная?

Dasar

да, с тредами фигня.

Dasar

хотя в VS C++ есть функция int _configthreadlocale( int type); которая позволяет настроить - будет локаль определятся для всего приложения или для одного треда.

nurlatluna

А почему не воспользоваться вторым аргументом isalpha? Разве экземпляры std::locale не независимы?

Dasar

хз, смотреть надо - в документации этот момент не освящается.

rosali

Потому что мы говорим про ::isalpha, который в <ctype.h>, а второй параметр есть у std::isaplha, который в <locale>. Я не знаю, чего плохого в С++-ных локалях (фасеты там и прочее но что-то не видел вообще ни разу, чтобы этим пользовались.

nurlatluna

Я пользовался. Только в STLport-е ничего кроме "С" нет
Оставить комментарий
Имя или ник:
Комментарий: