Делает ли это трюк с удалением начальных и конечных пробелов и заменой нескольких пробелов на одиночные?
Лучший способ ответить на этот вопрос - проверить его.
void Test(const char *input, const char *expected_output) {
char buffer[80];
strcpy(buffer, input);
RemoveSpace(buffer);
assert(strcmp(buffer, expected_output) == 0);
}
int main() {
Test(" Leading spaces removed.", "Leading spaces removed.");
Test("Trailing spaces removed. ", "Trailing spaces removed.");
Test("Inner spaces trimmed.", "Inner spaces trimmed.");
Test(" A little of everything. ", "A little of everything.");
Test(" \tTabs \t\tare \t spaces, too.", "Tabs are spaces, too.");
return 0;
}
Код в OP не проходит последний тест, поэтому ответ: нет .
Как вы думаете, это эффективное решение за один проход?
Это однопроходное решение. Если вы пытаетесь выжать каждую унцию эффективности, то вы хотите минимизировать количество операций и условных переходов.
При работе со строками C в C зачастую наиболее идиоматично использовать указатели, а не индексирование. В зависимости от компилятора и целевой платформы использование указателей может быть более или менее эффективным, чем индексирование, но оба они очень дешевы. Поскольку это уже один линейный проход, лучше всего написать его настолько четко, насколько это возможно, используя шаблоны идиоматического кода.
Вот мое решение:
#include <assert.h>
#include <ctype.h>
#include <string.h>
void RemoveSpace(char *string) {
char *target = string;
char *last = target;
int skipping_spaces = 1;
for (const char *source = string; *source != '\0'; ++source) {
if (isspace(*source)) {
if (!skipping_spaces) {
*target++ = *source;
skipping_spaces = 1;
}
} else {
*target++ = *source;
last = target;
skipping_spaces = 0;
}
}
*last = '\0';
}
По сути, это маленький конечный автомат, что означает, что на каждом шаге мы решаем, что делать, основываясь на текущем вводимом символе и текущем состоянии. Для этой проблемы наше государство просто: пропускаем ли мы пробелы в данный момент (и закладку, отслеживающую последнюю юридическую точку, заканчивающую строку).