Нашел один очень изящный способ решения данной задачи, делюсь.
void removeSpace(char *str) { char *p1 = str, *p2 = str; do while (*p2 == ' ') p2++; while (*p1++ = *p2++); }
Декабрь 10th, 2012 § 0 comments § Прямая ссылка
Нашел один очень изящный способ решения данной задачи, делюсь.
void removeSpace(char *str) { char *p1 = str, *p2 = str; do while (*p2 == ' ') p2++; while (*p1++ = *p2++); }
Декабрь 10th, 2012 § 0 comments § Прямая ссылка
Решил начать цикл постов, про алгоритмы и задачам, которые могут попасться на собеседовании. При желании все можно найти на просторах сети, но классно когда все лежит в одном месте. Так вот первая задачка, мне ее кстати задавали при поступлении в СПбАУ РАН на кафедру “математических и информационных технологий” к слову так и не поступил увы. Условие задачи.
Дана строка, удалить все лишние пробелы, под лишними будем иметь ввиду все пробелы в начале и в конце строки и более одного пробела внутри строки. Использовать еще одну строку запрещено. Ниже мое решение.
#include <stdio.h> #include <string.h> int main() { char* str = new char[128]; int len = sprintf(str," Some huge string with a lot multiple white spaces!!! "); if(len == 0) return -1; printf("%s\r\n",str); bool isStart = true; char* ptr = str; int i = 0; char previos = 'x'; //переменные надо инициализировать, а иначе может быть очень плохо ))) char* endPtr = &str[len - 1]; while(ptr != endPtr) { if(*endPtr == ' ') { endPtr--; continue; } if(*ptr == ' ' && isStart) { *ptr++; continue; } if(*ptr !=' ') { isStart = false; } if(previos == ' ' && *ptr == ' ') { *ptr++; continue; } previos = *ptr; str[i++] = *ptr++; } str[i++] = *endPtr; //тут записываем последний символ str[i]='\0'; printf("%s\r\n",str); getchar(); return 0; }
Не забывайте, что sprintf deprecated здесь используется только для демонстрации примера. Если вы обнаружили не точность в примере, лучший способ решения или, что еще хуже ошибку, отпишите в коменты, что бы распространять знание, а не на оборот.