【问题标题】:C++ test last character of a stringC++ 测试字符串的最后一个字符
【发布时间】:2015-08-07 05:26:01
【问题描述】:

我想测试 var 字符串是否以 '\n' 终止,以便从流异步套接字中检测并删除一些不完整的传入变量。以下代码似乎无法正常工作。为什么?

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

【问题讨论】:

  • 我还在摸索getline如何保留换行符。

标签: c++ string find character


【解决方案1】:

getline() 丢弃换行符。如果要测试 EOF,请测试 stringstream 对象本身。

【讨论】:

    【解决方案2】:

    var[size] 越界访问字符串。但是您可以使用std::string::back 成员来获取对最后一个元素的引用。

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

    这样可以避免潜在的索引错误。上面的代码假设var 不为空。您可以通过std::string::empty() 查询。例如,

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

    您希望如何在使用getline 读取的字符串中找到\n 是另一回事。

    【讨论】:

    • var.back()之前更好地测试非空字符串。
    • @Lingxi 同意。我提到了这一点,并举了一个例子。
    • @JorenHeit 避免任何歧义。有时人们会感到困惑。
    • 谢谢。你们的意思是 getline() 将删除“令牌”末尾的 '\n' ?
    猜你喜欢
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多