2014-12-11 2 views
2

В основном я хочу удалить все ведущие пробелы перед первым допустимым символом в массиве.Удаление пробелов до первого допустимого символа C

Например, если у меня есть что-то вроде ' 1.6, 1.7', я хочу, чтобы это было '1.6, 1.7' или, если это просто '1.7, 1.8', то это было бы '1.7, 1.8'

Это мой метод пробельных, однако это только показывает, где пробельные находятся. Мне нужна помощь в его устранении.

char **storeArray 

void Students::removeSpace() 
{ 
    int MAX_SIZE = 30; 
    for(int i=0; i<3; i++) 
    { 
    for(int j=0; j<MAX_SIZE; j++) 
    { 
     if(isspace(storeArray[i][j]) && !(isspace(storeArray[i][j++]) 
     { 
      // I NEED HELP HERE. I'M TRYING TO REMOVE ALL THE LEADING WHITESPACE ONLY 
     } 
    } 
    } 
} 
+1

принципе петли и подсчитать количество ведущие пробелы есть, а затем перенести весь массив влево на эту величину. – RPGillespie

+4

Студенты :: removeSpace() больше похоже на C++, чем C. Каково определение storeArray? – Christophe

+0

Возможный дубликат [Как отредактировать пробелы ведущего/конечного пробела стандартным образом?] (Http://stackoverflow.com/questions/122616/how-do-i-trim-leading-trailing-whitespace-in-a- стандартный) – kamino

ответ

1

Попробуйте что-то вроде этого:

#include <stdio.h> 

int main() 
{ 
    char storeArray[20] = " Check it out."; 
    int whitespace = 0; 

    printf("%s\n", storeArray); 

    //Count leading whitespace 
    for(int i=0; i<20; i++) 
    { 
     if(storeArray[i] == ' ' || storeArray[i] == '\t') 
      whitespace++; 
     else 
      break; 
    } 

    //Shift everything left 
    for(int i=0; i<20; i++) 
    { 
     if (i+whitespace < 20) 
      storeArray[i] = storeArray[i+whitespace]; 
     else 
      storeArray[i] = 0; 
    } 

    printf("%s\n", storeArray); 

    return 0; 
} 
+0

Спасибо, но не конечным результатом будет 'Checkitout .'? Потому что вы удаляете все пробелы –

+0

Нет, скомпилируйте его сами и посмотрите. Этот код только избавляется от ведущего пробела. Код 'break' после столкновения с первым символом без пробелов. – RPGillespie

0

Если вы уверены, что С-строки не длиннее MAX_SIZE, и если они являются нулем строки:

for(int i=0; i<3; i++) 
    { 
    int j=0; 
    while (j<MAX_SIZE && isspace(storeArray[i][j]) 
     j++; 
    if (j==MAX_SIZE) // oops ! Not null terminated and only whitespace ? 
     storeArray[i][0]='\0'; 
    else if (j>0) // if no leading whiespace do nothing ! 
     strcpy (storeArray[i], &storeArray[i][j]); // if you like c style 
    } 

Если вы работаете на C++ (как подсказывает Student::removeSpace()), и если вы действительно не хотите работать с std::string, то вы можете заменить все это:

for(int i=0; i<3; i++) 
     copy(find_if(storeArray[i], storeArray[i] + MAX_SIZE, [](char c){ return c && !isspace(c); }), storeArray[i] + MAX_SIZE, storeArray[i]); 

Edit: Если вы хотите, чтобы избежать перемещения ваших строк, и если вы можете позволить себе изменить строковые указатели (ieyou не динамически выделять строки), то вы могли бы сделать так:

for(int i=0; i<3; i++) 
     for (int j=MAX_SIZE-1; j>=0 && isspace(*storeArray[i]); j--) 
      storeArray[i]++; // no move or copy, but original pointer lost forever 
+0

Спасибо, мне нравится использовать c -strings, и он будет не длиннее, чем 'MAX_SIZE'. Thing is, как мне удалить завершающий пробел без копирования в массив? –

+1

Прокрутите массив назад и установите последнее пробельное пространство, с которым вы сталкиваетесь,' '\ 0'' – RPGillespie

+0

@RPGillespie, Извините, я не с вами. Зачем вам устанавливать последние пробелы в '' \ 0''? Я пытаюсь удалить ведущие пробелы только –

2

Чтобы удалить дополнительную Пробельный, марш через строку:

void Remove_Leading_ExtraMiddle_Trailing_Whitespace(char *s, int size) { 
    char *end = &s[size]; 
    char *t = s; 
    // skip leading 
    while (isspace(*s)) 
    s++; 

    // middle 
    for (;;) { 
    while (!isspace(*s) && *s != '\0') { 
     *t++ = *s++; 
    } 
    if (*s == '\0') 
     break; 
    *t = *s++; 
    while (isspace(*s)) 
     s++; 
    if (*s == '\0') { 
     break; 
    } 
    t++; 
    } 

    // end 
    while (t < end) { 
    *t++ = '\0'; 
    } 
} 

void removeSpace() { 
    int MAX_SIZE = 30; 
    char storeArray[4][MAX_SIZE]; 
    for (int i = 0; i < 3; i++) { 
    Remove_Leading_ExtraMiddle_Trailing_Whitespace(storeArray[i], MAX_SIZE); 
    } 
} 
+0

Мне это нравится. Если строки являются действительными строками, единственное, что я сделал бы по-другому, - это функция удаления, вычисляющая длину и не требующая отправки размера. –

+1

@David C. Rankin Согласен, но OP, похоже, хочет работать с массивом 'char', а не с строкой C. Сообщение IAC OP выглядит как C++, но с тегом C. – chux

0

Вы можете либо сохранить strtrimws как сны arate или включить его содержимое в вашу функцию Students::removeSpace. Следующая функция может использоваться с назначением возврата или без нее. Примеры: strtrimws (somestring); или char *newstring = strtrimws (somestring); Также обратите внимание, что в то время как исходная строка 's' изменена функцией, начальный адрес для 's' не изменяется, что делает его безопасным для использования с динамически выделенными строками. Ниже в контексте с removeSpace функции:

#include <ctype.h> 

/** remove leading and trailing whitespace, original not preserved. 
* this funciton can be used with or without assigning the return. 
*/ 
char *strtrimws (char *s) 
{ 
    char *sp = s;     /* start pointer to return */ 
    char *p = s;     /* pointer to parse string */ 

    while (isspace (*s)) s++;  /* skip leading whitespace */ 
    while (*s) *p++ = *s++;   /* reindex s to end   */ 
    while (isspace (*p)) *p-- = 0; /* null-terminate from end */ 

    return sp; 
} 

char **storeArray; 

void Students::removeSpace() 
{ 
    int i = 0; 
    for(int i=0; i<3; i++) 
     strtrimws (storeArray[i]); 
} 

ПРИМЕЧАНИЕ: если вы настроите все указатели на zero/NULL в storeArray перед назначением строк в (некоторые или все) из pointers-to-char можно упростить/улучшить removeSpace за счет устранения жестко закодированное число итераций для i и заменить его с простой:

void Students::removeSpace() 
{ 
    int i = 0; 
    while (storeArray[i]) 
     strtrimws (storeArray[i++]); 
} 

Пример Funciton в использовании:

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

/** remove leading and trailing whitespace, original not preserved. 
* this funciton can be used with or without assigning return. 
*/ 
char *strtrimws (char *s) 
{ 
    char *sp = s;     /* start pointer to return */ 
    char *p = s;     /* pointer to parse string */ 

    while (isspace (*s)) s++;  /* skip leading whitespace */ 
    while (*s) *p++ = *s++;   /* reindex s to end   */ 
    while (isspace (*p)) *p-- = 0; /* null-terminate from end */ 

    return sp; 
} 

int main (int argc, char **argv) 
{ 
    if (argc < 2) { 
     fprintf (stderr, "\n error: insufficient input. Usage: %s char* char* ... (max 5)\n\n", argv[0]); 
     return 1; 
    } 

    char array[5][50] = {{0}}; 
    int i = 0; 

    for (i = 1; i < argc; i++) 
    { 
     strncpy (array[i-1], argv[i], strlen (argv[i])); 
     printf ("\n array[%d] '%s'\n", i, strtrimws (array[i-1])); 
    } 

    return 0; 
} 

выход:

$ ./bin/stripwsarray " string 1 ws " " string 2 ws " " string 3 ws " 

array[0] 'string 1 ws' 

array[1] 'string 2 ws' 

array[2] 'string 3 ws' 

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

  • Нет связанных вопросов^_^