2014-11-17 5 views
-1

я пытаюсь вернуть чистую строку (без пробелов в начале или в конце строки)
поэтому я использую распределение Dynamique и указатели,как вернуть чистую строку

char* killspace(char *a) 
{ 
    char *enda = NULL; 
    int i = 0, spaceS = 0, spaceE = 0, bigend = 0 , out = 0, taille = strlen(a); 
    do 
    { 
     if (a[i] == ' ') 
     { 
      spaceS++; 
     } 
     else 
     { 
      out = 1; 
     } 
     i++; 
    } while (out == 0); 
    out = 0; 
    do 
    { 
     if (a[taille] == ' ') 
     { 
      spaceE++; 
     } 
     else 
     { 
      out = 1; 
     } 
     taille--; 
    } while (out == 0); 
    bigend = (spaceE + spaceS); 
    // new size 
    enda = (char *)calloc((strlen(a)-bigend), sizeof(char)); 
    i = 0; 
    for (int j = spaceS; j < (strlen(a)-spaceE); j++) 
    { 
     enda[i] = a[j]; 
     i++; 
    } 
    return(enda); 
    free(enda); 

} 

bigend свы Номбры неиспользованного на начинаются и в конце строки , но взамен я получу чистую строку + caractre как (YYYY «« «« «« «« îþîþîþ)
и простите за мой плохой английский :(

+3

Вы забыли обнулить конец символа, добавив '\ 0' в конце его. –

+3

Что такое 'free()' после безусловного «возврата», которого нужно достичь? – EOF

+0

Я освободил освобождение памяти, и нет условия для возврата –

ответ

2

Изменение начать ning address to string, требуется либо (1), отправив адрес указателю, содержащему строку в качестве аргумента, чтобы его можно было изменить, либо (2), возвращая указатель на новое начало обрезанной строки из функции , Последнее, вероятно, лучше всего. Вот пример:

#include <stdio.h> 
#include <ctype.h> 

char *trimstr (char *s) 
{ 
    while (isspace(*s))  /* while space, increment pointer */ 
     s++; 

    char *p = s;   /* pointer to string s    */ 
    while (*p) p++;   /* advance pointer to end of s  */ 
    p--;     /* decrement pointer off null-term */ 

    while (isspace(*p))  /* while space, set new end of str */ 
    { 
     *p = 0; 
     p--; 
    } 

    return s;    /* return pointer to trimmed string */ 
} 

int main() { 

    char mystring[] = " some string with leading/trailing WS "; 
    char *p = mystring; 

    printf ("\n Original String: '%s'\n\n", mystring); 

    p = trimstr (mystring); 

    printf (" Trimmed String : '%s'\n\n", p); 

    return 0; 
} 

выход:

$ ./bin/trimstr 

    Original String: ' some string with leading/trailing WS ' 

    Trimmed String : 'some string with leading/trailing WS' 

Подойдя проблему таким образом, как правило, приводит к более коротким кодом, который пытается сделать «индекс-перетасовать» переместить все символы вниз в строке, чтобы покрыть ведущие пробелы. Тем не менее, нет ничего плохого в «index-shuffle», вам просто нужно быть конкретным со смещением и не забывать также смещать null-terminator.

Если вы заинтересованы в сохранении строк коды, более компактными, хотя и чуть менее читаемую версия функции trimstr можно записать следующим образом:

char *trimstr (char *s) 
{ 
    while (isspace(*s)) s++;  /* while space, increment pointer */ 
    char *p = s;     /* pointer to string s    */ 
    while (*p) p++;     /* advance pointer to end of s  */ 
    while (isspace(*(--p))) *p = 0; /* while space, set new end of str */ 
    return s;      /* return pointer to trimmed string */ 
} 
+0

спасибо ваш метод более эффективен :) –

+1

Рад, что это было полезно для вас. Потратьте некоторое время и перейдите к используемой логике указателя. Это действительно хороший пример, чтобы помочь цементу использовать указатели в C. Отличным способом сделать это было бы взятие строки '' ws ''в качестве входных данных, а затем на листе бумаги, что происходит.Указатели - одна из самых изумительных (до тех пор, пока они были изучены), но мощные концепции C. –

0

я foubd проблемы в моем случае я Pute в конце строки ограничитель enda[i] = '\0';, и он работает для меня