Intereting Posts
Случайные значения остаются неизменными в C Самый быстрый способ проверить, существует ли файл Как реализовать strtol при const-правильности? OpenMP: ошибка: «w.13» не указывается в параллельной параллели Как я могу добавить два массива 2d (стадия), используя вложенные для циклов? Существуют ли возможные подходы к обработке сигналов карт (c library) в исключение c ++? Что происходит, когда вы пытаетесь освободить () уже освобожденную память в c? Как получить время, прошедшее через C в миллисекундах? (Windows) Пользовательская результирующая переменная OpenMP Генерация взвешенных случайных чисел В чем разница в том, как C и Java обрабатывают доступ к границам массивов? Указатели в C – 1D и 2D Почему невозможно собрать getaddrinfo при компиляции с помощью gcc и std = c99 Полностью оптимизированный memcpy / memmove для архитектуры Core 2 или Core i7? Выделение / освобождение указателя базовой C

Как удалить пробелы в строчном предложении

Я пытаюсь написать код, чтобы удалить все ведущие, конечные и средние пространства предложений, но сохранить только одно пространство между словами.

Например, если вход

" This is my string " 

выход должен быть

 "This is my string" 

До сих пор я придумал следующее:

 #include  void cascade(char str[], int i); main() { char str[100] = " This is my string "; int i = 0; while (str[i] != '\0') { if (str[i] == ' ' && str[i + 1] == ' ') cascade(str, i); i++; } printf("%s\n", str); } void cascade(char str[], int i) { while(str[i] != '\0') { str[i] = str[i + 1]; i++; } str[i + 1] = '\0'; } 

Я был бы признателен, если бы кто-нибудь мог придумать некоторые идеи, спасибо.

 #include  #include  char* trim(char str[]){ char *p=str; char *token; if(str == NULL) return NULL; if(*str == '\0') return str; token=strtok(str, " \t"); if(token == NULL){ *str = '\0'; return str; } while(NULL!=token){ int len; len = strlen(token); if(p != token){ memmove(p, token, len); } p += len; *p++ =' '; token = strtok(NULL, " \t"); } p[-1]='\0'; return str; } int main(){ char str[100] = " This is my string "; printf("\"%s\"\n", trim(str)); return 0; } в #include  #include  char* trim(char str[]){ char *p=str; char *token; if(str == NULL) return NULL; if(*str == '\0') return str; token=strtok(str, " \t"); if(token == NULL){ *str = '\0'; return str; } while(NULL!=token){ int len; len = strlen(token); if(p != token){ memmove(p, token, len); } p += len; *p++ =' '; token = strtok(NULL, " \t"); } p[-1]='\0'; return str; } int main(){ char str[100] = " This is my string "; printf("\"%s\"\n", trim(str)); return 0; } 

Используйте два указателя. Первые точки следующего символа должны быть прочитаны, а второй – в месте записи.

Если вы читаете два пробела подряд, не нажимайте указатель записи.


Другой подход, который вы можете рассмотреть, – использовать strtok с " " как разделитель.

У вас может быть два массива и два счетчика. На каждой итерации вы всегда увеличиваете свой первый счетчик, но только увеличиваете свою вторую, когда персонаж не является пространством. Стол будет выглядеть так.

  Char In-Pos Out-Pos ' ' 0 0 ' ' 1 0 ' ' 2 0 ' ' 3 0 'T' 4 0 'h' 5 1 'i' 6 2 's' 7 3 ' ' 8 4 ' ' 9 5 ' ' 10 5 ' ' 11 5 'i' 12 5 's' 13 6 ' ' 14 7 'm' 15 8 'y' 16 9 ' ' 17 10 ' ' 18 11 ' ' 19 11 ' ' 20 11 ' ' 21 11 's' 22 11 't' 23 12 'r' 24 13 'i' 25 14 'n' 26 15 'g' 27 16 ' ' 28 17 ' ' 29 18 ' ' 30 18 ' ' 31 18 

Вы можете использовать строковый токенизатор в первом экземпляре и использовать в качестве разделителя пробел (“”). Для этого в C вы используете strtok. После этого вы анализируете вывод функции strtok, а для каждого элемента, если он содержит больше символов пробелов, вы их устраняете. Также вы помещаете каждый исправленный элемент в другой массив. Затем все, что вам нужно сделать, – это проанализировать новый массив и добавить пробел после каждого элемента. Если вам нравится эта идея, я могу предоставить вам черновик кода.

 #include  #include  #include  char** split(const char *str, const char *delimiter, size_t *len){ char *text, *p, *first, **array; int c; char** ret; *len = 0; text=strdup(str);//strdup not standard if(text==NULL) return NULL; for(c=0,p=text;NULL!=(p=strtok(p, delimiter));p=NULL, c++)//count item if(c==0) first=p; //first token top ret=(char**)malloc(sizeof(char*)*c+1);//+1 for NULL if(ret==NULL){ free(text); return NULL; } //memmove? strcpy(text, str+(first-text));//skip until top token array=ret; for(p=text;NULL!=(p=strtok(p, delimiter));p=NULL){ *array++=p; } *array=NULL; *len=c; return ret; } void free4split(char** sa){ char **array=sa; if(sa!=NULL){ free(array[0]);//for text free(sa); //for array } } int main(void){ char str[100] = " This is my string "; char **words; size_t len=0; int i; words = split(str, " \t", &len); *str = '\0'; for(i = 0;i