2013-07-19 4 views
0

Я пытаюсь удалить символы из указателя char и хотел бы сохранить их обратно в новой переменной указателя символов, скажем, «temp». Так что я бы что-то вроде этого:Удалить элементы из char * C++

char *test = "[email protected]#3$4%5^6&7*[email protected]#0"; 
char *temp = ""; 

затем удалить "@, #, $,%, ^, *, @, #,!" И разместить новые значения "12345678910" в * темп , Это сделало бы temp равным «12345678910».

Возможно ли это?

Я делал это со строкой, но мне действительно нужно сделать это с помощью указателей на символы. Вот как я это сделал со строкой:

std::string str("[email protected]#3$4%5^6&7*[email protected]#0"); 
std::string temp(""); 

    char chars[] = "@#$%^&*!"; 

    for (unsigned int i = 0; i < strlen(chars); ++i) 
    { 
     str.erase (std::remove(str.begin(), str.end(), chars[i]), str.end()); 

    } 
    temp = str; 

Так что вы здесь видите, что я делаю это все строки, но я просто не могу уйти с asigning полукокса * переменная, как тест на строку, потому что сво незаконное обращение. Однако почему я могу установить мои переменные char * равным строке так?

char *test = "123456789"; 

Однако это незаконно?

std::string str("[email protected]#3$4%5^6&7*[email protected]#0"); 

    char chars[] = "@"; 

    for (unsigned int i = 0; i < strlen(chars); ++i) 
    { 
     str.erase (std::remove(str.begin(), str.end(), chars[i]), str.end()); 

    } 

    char *test = str; //Illegal point 

Благодарим за ваше время.

+0

Зачем вам нужно использовать 'char *'? 'std :: string' был разработан в основном потому, что использование' char * 'для строк бессмысленно болезненно. Вы также можете уточнить, какие символы вы хотите сохранить/удалить - просто вы хотите удалить '@' или просто сохранить десятичные цифры или что именно? –

+0

Это выглядит как задание для регулярных выражений. – StephenTG

+0

Если вам нужно использовать char * для строк (я предполагаю, что вы используете интерфейсы старого стиля для функций), используйте строку string.c_str(). Не пытайтесь манипулировать char * напрямую - они не массивы и не должны рассматриваться как массивы. –

ответ

3

изменение

char *test = str; 

в:

char *test = str.c_str(); 

c_str это метод, который создает с стиль массив символов из исходной строки для вас.

EDIT: это более безопасный способ, будет получена копия строки гр:

#include <cstring> 
#include <cstdlib> 
... 
char *test = strdup(str.c_str()); 
... // process the string 
free(test); 

Here у вас есть ссылка на станд класса строки. Manpage для strdup.

+1

Вы должны быть осторожны с 'c.str()', поскольку он возвращает внутренний 'char *', который будет удален, когда вызывается деструктор 'str', и в любом случае можно время от времени перемещать.Лучше сделайте копию, если вы хотите ее сохранить. – rabensky

+0

Отлично! Спасибо тебе за это. Мне просто нужно быстро протестировать, и я вернусь к вам. Большое спасибо за быстрый ответ. Я очень ценю это. – user2577497

+0

Хорошо, я попытался сделать его копию так: 'const char * temp = str.c_str(); const char * final = * temp; 'Но он говорит:« значение типа «char» не может использоваться для инициализации объекта типа «const char *» Я правильно делаю это? – user2577497

0

Все, что вы можете сделать с помощью итераторов, вы также можете делать с указателями на массив. Скажем, массив символов:

char str[] = "[email protected]#3$4%5^6&7*[email protected]#0"; 

char chars[] = "@"; 

for (unsigned int i = 0; i < strlen(chars); ++i) 
{ 
    *std::remove(str, str+strlen(str), chars[i])=0; 

} 

Обратите внимание, что я использовал тот факт, что std::remove возвращает iterator (в данном случае char*) на «один за последний» элемент и установить, что символ 0 - убедившись, что он остается строка с нулевым ограничением