Проблемой оказывается имя функции в определении функции float lower_bound(Repr)
. К сожалению, lower_bound
конфликтует с функцией из стандартной библиотеки в <algorithm>
. Без шаблона по умолчанию у компилятора было недостаточно информации, чтобы различать пользовательскую функцию и стандартную библиотеку.
Можно сделать это полностью на месте.
void stripLeadingAndTrailingSpaces(char* string){
assert(string);
/* First remove leading spaces */
const char* firstNonSpace = string;
while(*firstNonSpace != '\0' && isspace(*firstNonSpace))
{
++firstNonSpace;
}
size_t len = strlen(firstNonSpace)+1;
memmove(string, firstNonSpace, len);
/* Now remove trailing spaces */
char* endOfString = string + len;
while(string < endOfString && isspace(*endOfString))
{
--endOfString ;
}
*endOfString = '\0';
}
Если Вы находитесь на Linux/Windows и имеете библиотеку, бойкую связанный в Вашу программу, можно использовать стандартную программу g_strstrip()
.
Необходимо смочь сделать это оперативный; разделение пробела никогда не может заставлять строку расти. Вы смогли делать это без первой проверки длины строки, но выполнение так могло бы быть напрасно "умным". Необходимо изучить memmove()
функция, в дополнение к тем @Norman Ramsey упомянул.
int i = strlen(s) - 1;
while (isspace(s[i]))
s[i--] = '\0';
while (isspace(*s))
s++;
Это должно заботиться о проблеме, пока Вы не заботитесь о том, чтобы портить строку как сумасшедший и если Вы не заботитесь об утечках памяти!
Вот версия с помощью isspace:
char * trim(char *c) {
char * e = c + strlen(c) - 1;
while(*c && isspace(*c)) c++;
while(e > c && isspace(*e)) *e-- = '\0';
return c;
}
char *strstrip(char *s)
{
char *end;
while ( (*s) && isspace( *s))
s++;
if(!( *s) )
return s;
end = s;
while( ! *end)
end++;
end--;
while (end ! = s && isspace( *end))
end--;
*(end + 1) = '\0';
return s;
}
Это - в основном больше оптимизированного кода (с точки зрения скорости и размера кода).
Если мы должны сохранить пространство памяти затем,
void strstrip(char *s)
{
char *start;
char *end;
start = s;
while ( (*start) && isspace( *start))
start++;
if(!( *start) )
{
*s='\0';
return ;
}
end = start;
while( ! *end)
end++;
end--;
while (end ! = start && isspace( *end))
end--;
*(end + 1) = '\0';
memmove(s, start, end-start+1);
return;
}
Вот то, как ядро Linux делает обрезку, названную strstrip ():
char *strstrip(char *s)
{
size_t size;
char *end;
size = strlen(s);
if (!size)
return s;
end = s + size - 1;
while (end >= s && isspace(*end))
end--;
*(end + 1) = '\0';
while (*s && isspace(*s))
s++;
return s;
}
В основном лучшая отформатированная и проверенная в ошибке версия, что предыдущий сказанный плакат.
Этот вопрос смотрит, как будто это мог бы быть вопрос о домашней работе, таким образом, я отвечу косвенно: ищите страницы справочника для isspace (3) и strlen (3) и используйте адресную арифметику с указателями. Также в зависимости от проблемы под рукой Вам, возможно, понадобится malloc (3) для содержания пространства для результата.
Не забывайте, что представление струны до включает запаздывающие 0 байтов, часто записанные '\0', который не считается как часть длины строки.
Вот более краткая и более безопасная версия первой функции lakshmanaraj:
#include <ctype.h>
char *mytrim(char *s)
{
if(s) { /* Don't forget to check for NULL! */
while(*s && isspace(*s))
++s;
if(*s) {
register char *p = s;
while(*p)
++p;
do {
--p;
} while((p != s) && isspace(*p));
*(p + 1) = '\0';
}
}
return(s);
}