2015-10-30 3 views
0

Я создаю небольшую функцию, которая увидит, является ли char в массиве символов пробелом. Если это так, он удалит пробел. До сих пор у меня есть:C++: избавление от char в массиве char

void clean(char* n, int size){ 
for (int i = 0; i<size; i++){ 
     if (n[i]==' '){ 
      n[i]= ''; 
     } 
} 

};

Однако я получаю сообщение об ошибке:

warning: empty character constant [-Winvalid-pp-token] 

Мой вопрос: как я могу, withouth любые библиотеки, избавиться от пространства в массиве полукокса. Что я должен здесь поместить:

n[i]= ____ 

Спасибо!

ответ

3

Когда вы найдете пробел, вам нужно перетасовать остальную часть строки влево.

Так коды нужна (при условии, оканчивающийся нуле строка)

void clean(char* n) { 
    for (int from = 0, to = 0; n[from]; ++from) { 
    if (n[from] != ' ') { 
     n[to] = n[from]; 
     ++to; 
    } 
    } 
    n[to] = 0; 
} 

Это будет копировать строку в себя, удаляя пробела по пути

3

Не перепутать строковые константы и символьные константы:

"h" 

- это строковая константа, содержащая один символ плюс символ NULL для обозначения терминации.

'h' 

является символьной константой, это один символ, не более, не менее.

В C++ "" действительно пустая строка, но '' является недопустимым синтаксисом, так как символ обязательно имеет значение.

Удаление одного символа из строки более активно, чем это.

Если у вас есть, например, строку, как это:

"foo bar" 

Удаление символа пробела на самом деле состоит в перенесении всех последующих символов влево.

"foo bar" 
    ^
    | 
    +- bar\0 

И не забудьте также переместить конечный символ NULL («\ 0»), так что строка заканчивается правильно после того, как «г».

0

Если вы помните, что стандартные алгоритмы C++ отлично работают с массивами, то самым изящным решением этой проблемы является std::remove. Вот пример:

#include <algorithm> 
#include <iostream> 
#include <string.h> 

void clean(char* n, int size) { 
    std::remove(n, n + size, ' '); 
} 

int main() { 
    char const* test = "foo bar"; 
    // just some quick and dirty modifiable test data: 
    char* copy = new char[strlen(test) + 1]; 
    strcpy(copy, test); 

    clean(copy, strlen(copy) + 1); 

    std::cout << copy << "\n"; 

    delete[] copy; 
} 

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


Конечно, в реальном коде, вы не должны использовать динамические массивы, в первую очередь, но использовать std::string:

#include <algorithm> 
#include <iostream> 
#include <string> 

void clean(std::string& n) { 
    n.erase(std::find(n.begin(), n.end(), ' ')); 
} 

int main() { 
    std::string test = "foo bar"; 
    clean(test); 
    std::cout << test << "\n"; 
} 
Смежные вопросы