2015-05-09 3 views
1

Я пытаюсь написать функцию левого дифферента на C. Может кто-нибудь пожалуйста, выяснить, что это ошибка, которую я делаюфункция LTRIM в C

int main() 
{ 
    char string2[]=" wind"; 
    ltrim(string2); 
    int new_len2=strlen(string2); 
    printf("After trim String2 is <%s>\nLength is %d\n",string2,new_len2); 
    return 0; 
} 

void ltrim(char *string) 
{ 
int i=0; 
while(string[i]==' ') 
    { 
    i++; 
    string=string+i; 
    } 
printf("inside function string is <%s>---length is %d\n",string,strlen(string)); 
} 

выход:

inside function string is <wind>---length is 4 
After trim String2 is < wind> 
Length is 7 

Почему строку не изменяется в основной функции после обрезки.

+0

Подсказка: проверьте, где строки строки2 после запуска вашей функции. – Nit

+0

Верните 'string' из' ltrim' и напечатайте его с 'main'. И 'string = string + i;' должно быть 'string ++;' или 'string = string + 1;'. –

ответ

2

Эффективный подход будет подсчитывать число ведущих пробелов, а затем переместить строку слева точно это количество символов в одном дыхании:

#include <ctype.h> /* for is blank() */ 
#include <string.h> /* for memmove() */ 

void ltrim(char * s) 
{ 
    char * s_tmp = s; 

    while (isblank(*s_tmp)) /* isblank() detects spaces and tabs. */ 
    { 
    ++s_tmp; 
    } 

    memmove(s, s_tmp, s_tmp - s); /* Please note the use of memmove() here, as it 
            allows the use of overlapping memory areas, 
            which is not allowed for memcpy(). 
} 
+0

@alk для меня это не работает – Aravind

+0

@ user3121023: Absolutetly! Исправлена. – alk

4

Минималистичный раствор без использования <string.h>

void ltrim(char *src) 
{ 
char *dst; 

    /* find position of first non-space character */ 
for (dst=src; *src == ' '; src++) {;} 

    /* nothing to do */ 
if (dst==src) return; 

    /* K&R style strcpy() */ 
while ((*dst++ = *src++)) {;} 

return; 
} 
+0

1+ для отдельного обращения с футляром размером 0 байт! :-) – alk

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