2012-05-15 6 views
0

У меня возникли проблемы с удалением первых двух символов из моего массива char.Удаление первых двух символов из массива Char

input[MAXSIZE] = "./hello"; 

for(int i = 2; i < MAXSIZE; i+=2) 
{ 
    strcpy(input[i-2],input[i]); 
} 

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

invalid conversion from ‘char’ to ‘char*’ 
initializing argument 1 of ‘char* strcpy(char*, const char*)’ 
invalid conversion from ‘char’ to ‘const char*’ 
initializing argument 2 of ‘char* strcpy(char*, const char*)’ 

Я знаю, что это очень простая задача, но им достаточно новое для этого. Также, если есть более простой способ обойти эту проблему, не стесняйтесь обучать меня.

+2

Есть ли причина, по которой вы не используете 'std :: string'? – hmjd

+2

вы также можете просто использовать указатель на третий символ (char * modified_input = & input [2]) в качестве нового «массива» без перемещения или копирования символов вообще. – user396672

ответ

3

strcpy копии массивов символов с нулевым завершением, а не символы.

Что вы хотите:

input[i-2] = input[i]; 

Кроме того, почему бы не увеличивать i с 1, но с 2?

+0

Спасибо, я должен был попробовать это раньше! –

2

Как уже говорили другие, strcpy не предназначен для использования, как, что и вы можете достичь желаемого эффекта с

// loop step changed to 1; i += 2 is a mistake 
for(int i = 2; i < MAXSIZE; ++i) 
{ 
    input[i-2] = input[i]; 
} 

Однако, вы также можете просто использовать memmove:

memmove(input, input + 2, (MAXSIZE - 2)/sizeof(input[0])); 

Если input гарантированно будет массив char вы также можете удалить часть / sizeof(input[0]).

И конечно еще лучше бы сделать это стандартный способ библиотеки, используя std::copy_backward (необходимо, так как диапазоны источника и назначения перекрываются):

#include <algorithm> 
std::copy_backward(input + 2, input + MAXSIZE, input + MAXSIZE - 2); 
1

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

char input[MAXSIZE] = {0}; 
snprintf_s<MAXSIZE>(input, _TRUNCATE, "./hello"); //MSVC only 
char* noDotSlash = input + 2; 
cout << noDotSlash << endl; //should print just hello. 
+0

очень элегантный. мне это нравится! – eladyanai

Смежные вопросы