Вот функция, чтобы сделать то, что Вы хотите. Это должно заботиться о вырожденных случаях, где строка является всем пробелом. Необходимо передать в буфере вывода и длине буфера, что означает, что необходимо передать в буфере, который Вы выделяете.
void str_trim(char *output, const char *text, int32 max_len)
{
int32 i, j, length;
length = strlen(text);
if (max_len < 0) {
max_len = length + 1;
}
for (i=0; i<length; i++) {
if ( (text[i] != ' ') && (text[i] != '\t') && (text[i] != '\n') && (text[i] != '\r')) {
break;
}
}
if (i == length) {
// handle lines that are all whitespace
output[0] = 0;
return;
}
for (j=length-1; j>=0; j--) {
if ( (text[j] != ' ') && (text[j] != '\t') && (text[j] != '\n') && (text[j] != '\r')) {
break;
}
}
length = j + 1 - i;
strncpy(output, text + i, length);
output[length] = 0;
}
, если операторы в циклах могут, вероятно, быть заменены isspace (текст [я]) или isspace (текст [j]) для создания строк немного легче читать. Я думаю, что сделал, чтобы они установили этот путь, потому что были некоторые символы, на которые я не хотел тестировать, но похоже, что я покрываю весь пробел теперь:-)
Некоторый поиск не нашел способа сделать это. Предлагаемые альтернативы - поместить тест в ваш код и добавить стандартную точку останова:
if (myStr == "xyz")
{
// Set breakpoint here
}
Или построить тест на основе сравнения отдельных символов. Даже смотреть на отдельные символы в строке немного рискованно; в Visual Studio 2005 мне пришлось копаться в переменных-членах вроде
myStr._Bx._Buf[0] == 'x' && myStr._Bx._Buf[1] == 'y' && myStr._Bx._Buf[2] == 'z'
Ни один из этих подходов не является удовлетворительным. У нас должен быть лучший доступ к повсеместной функции стандартной библиотеки.