2015-08-07 3 views
0

Я хочу проверить, завершена ли строка var символом '\ n' или нет, чтобы обнаружить и удалить некоторые неполные входящие переменные из сокета async потока. Кажется, что следующий код работает неправильно. Зачем ?C++ test последний символ строки

string var; 
char *rest = nullptr; 
char *pVar = nullptr; 
istringstream iss(sReadBuffer); // Put into a stream    
while (getline(iss, var)) // Default delimiter '\n' or EOF 
{      
    int size = var.size(); 
    pVar = _strdup(var.c_str()); // Cast string to char * for later use (strstr,...) 

    if(var[size] != '\n') // If incomplete variable found (not newline ended)... 
    { 
     debug("Incomplete variable found : ", pVar, "\n"); 
     rest = pVar;         
     break; 
    } 

//... proceed with variable normally if they are complete 
+1

Я все еще понимаю, как 'getline' сохранил новую строку. – WhozCraig

ответ

1

var[size] Доступ к строке за пределами границ. Но вы можете использовать член std::string::back, чтобы получить ссылку на последний элемент.

if(var.back() != '\n') 

Это позволяет избежать возможных ошибок индексации. Вышеприведенный код предполагает, что var не пуст. Вы можете проверить это с помощью std::string::empty(). Например,

if((!var.empty()) && (var.back() != '\n')) 

Как вы ожидаете найти в строке чтения с getline в \n другое дело.

+2

Лучше проверить непустую строку перед 'var.back()'. – Lingxi

+0

@Lingxi Согласен. Я добавил упоминание об этом и пример. – juanchopanza

+0

@juanchopanza почему так много брекетов? – JorenHeit

2

getline() отбрасывает новую строку. Если вы хотите протестировать EOF, проверьте сам объект stringstream.

Смежные вопросы