我有一个程序用于检查字符串中的子字符串。 程序:
#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()方法返回了什么?
答案 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处找到空的子字符串pos <= size()
在您的示例pos
中0
使用默认参数,因此find
会返回0
。由于find
返回0
,因此您满足if条件。为防止这种情况,您可以检查空字符串,如
if(position != std::string::npos && !substr.empty())
答案 2 :(得分:0)
问题在于,通过输入新行,您基本上不会搜索任何内容,即""
。立即找到""
(在字符串的开头),因此position
为0
,而不是-1
(std::string::npos
)。 std :: getline不会检索换行符。
答案 3 :(得分:0)
根据cplusplus - .find()函数返回
第一场比赛的第一个角色的位置。
当你按下enter按钮时,std :: getline()接受一个空字符串,每个字符串中都有一个空字符串。所以它返回位置0(字符串的开头)。
您可以检查子字符串是否为空以避免这种情况。