当substring只是换行符时,string.find(substring)函数会返回什么?

时间:2016-02-12 13:31:19

标签: c++ string

我有一个程序用于检查字符串中的子字符串。 程序:

#include<iostream>
#include<cstring>
int main()
{
  std::string str, substr;
  std::cout<<"\n Enter a string : ";
  std::getline(std::cin, str);
  std::cout<<"\n Enter a possible substring of the string : ";
  std::getline(std::cin, substr);
  std::size_t position = str.find(substr);
  if(position != std::string::npos)
    std::cout<<substr<<" was found at position "<<position<<std::endl;
  else
    std::cout<<"\n The substring you entered wasn't found \n";
  return 0;
}

我有一个输入没有给出正确的输出。 例如:

 Enter a string : Stackoverflow         

 Enter a possible substring of the string : 
 was found at position 0

输入子串时我只需按回车键即可。所以输出应该是The substring you entered wasn't found。 在这种情况下,find()方法返回了什么?

4 个答案:

答案 0 :(得分:0)

[HttpPost] public ActionResult PoliteUpload(HttpPostedFileBase UserFile) { String viewReturned = "Polite"; if (UserFile != null && UserFile.ContentLength > 0) { TempData["MessageTitle"] = @Resource.ExtensionOkTitle; TempData["Message"] = @Resource.ExtensionOk; string extension = Path.GetExtension(UserFile.FileName); if (extension.Equals(".xls")) { //Old version ok } else if (extension.Equals(".xlsx")) { //Current version ok } else { TempData["Error"] = true; TempData["Message"] = @Resource.ExtensionKo; TempData["MessageTitle"] = @Resource.ExtensionKoTitle; } } else { TempData["Error"] = true; TempData["MessageTitle"] = @Resource.NoFileTitle; TempData["Message"] = @Resource.NoFile; } return RedirectToAction(viewReturned); } 函数不包含返回字符串中的换行符,因此如果只按Enter键,它将返回一个空字符串。空字符串是任何字符串。

在进行搜索之前,添加代码以验证std::getline()是否为空。

答案 1 :(得分:0)

在空输入上按Enter键不会在字符串中添加换行符。 std::getline使用换行符,所以你只需要一个空字符串作为子字符串。

根据cppreference函数std::string::find

  

当且仅当pos <= size()

时,才会在pos处找到空的子字符串

在您的示例pos0使用默认参数,因此find会返回0。由于find返回0,因此您满足if条件。为防止这种情况,您可以检查空字符串,如

if(position != std::string::npos && !substr.empty())

答案 2 :(得分:0)

问题在于,通过输入新行,您基本上不会搜索任何内容,即""。立即找到""(在字符串的开头),因此position0,而不是-1std::string::npos)。 std :: getline不会检索换行符。

答案 3 :(得分:0)

根据cplusplus - .find()函数返回

  

第一场比赛的第一个角色的位置。

当你按下enter按钮时,std :: getline()接受一个空字符串,每个字符串中都有一个空字符串。所以它返回位置0(字符串的开头)。

您可以检查子字符串是否为空以避免这种情况。