2011-01-21 3 views

ответ

12
void chopN(char *str, size_t n) 
{ 
    assert(n != 0 && str != 0); 
    size_t len = strlen(str); 
    if (n > len) 
     return; // Or: n = len; 
    memmove(str, str+n, len - n + 1); 
} 

Альтернативный дизайн:

size_t chopN(char *str, size_t n) 
{ 
    assert(n != 0 && str != 0); 
    size_t len = strlen(str); 
    if (n > len) 
     n = len; 
    memmove(str, str+n, len - n + 1); 
    return(len - n); 
} 
+0

+1, но не лучше ли это, как int, который печатает # символов на самом деле, оставшихся (или -1 вместо утверждения)? –

+0

@ Тим: есть всевозможные варианты дизайна; это примерно минимальная реализация - в целом, я думаю, что назначение лучше, чем раннее возвращение. Что касается возвращаемого значения - мне будет хорошо с возвратом уменьшенной длины - это скорее будет 'size_t', чем вход. –

0

В C строка представляет собой массив символов в непрерывных местах. Мы не можем ни увеличить, ни уменьшить размер массива. Но создайте новый массив символов размером оригинального размера минус 3 и скопируйте символы в новый массив.

+1

Это скопирует первые три символа строки. В вопросе спрашивается, как * удалить * первые три символа. – mipadi

+0

Да, просто заметили.Изменил его. Благодарю. – Mahesh

18

Добавить 3 к указателю:

char *foo = "abcdef"; 
foo += 3; 
printf("%s", foo); 

напечатает "DEF"

+1

Необходимо проверить, чтобы сначала было как минимум три символа! – kindall

+0

@kindall: конечно ..;) – BlackBear

0

Ну, узнать о струнной копии (http://en.wikipedia.org/wiki/Strcpy), индексирование в строку (http://pw1.netcom.com/~tjensen/ptr/pointers.htm) и повторите попытку. В псевдокоде:

find the pointer into the string where you want to start copying from 
copy from that point to end of string into a new string. 
+1

-1. Код без объяснения лучше, чем ссылки на ссылки и совершенно очевидные «псевдокоды». – pelesl

6

Например, если у вас есть

char a[] = "123456"; 

самый простой способ удалить первые 3 символа будут:

char *b = a + 3; // the same as to write `char *b = &a[3]` 

б будет содержать «456»

Но в общем случае вы также должны убедиться, что длина строки не превышала

+0

Не только 'sizeof (char)' ** бесполезно **, это также ** неправильно ** для других типов. Арифметика указателя происходит в единицах элементов, а не в байтах. –

+0

Да, вы правы. Изменили ответ –