如何在C ++中检查字符串的结尾?

时间:2014-02-06 07:55:24

标签: c++ indexing

我有一个我正在尝试实现的基本程序,要求输入.pdf文件的URL,然后下载并通过Xming显示它。首先,我想检查一下,确保用户实际输入的网址前面是“http://”,最后是“pdf”或“PDF”。我想这可能是来自Python的人的典型问题,但我如何检查用户输入的字符串的结尾。使用下面的方法(我用我的面向Python的大脑)我得到了一个

Range error: -3

那么ACTUAL C ++程序员如何完成这项任务呢?拜托,谢谢你。

if (file[0]=='h' && file[1]=='t' && file[2]=='t' && file[3]=='p' && file[4]==':'
&& file[5]=='/' && file[6]=='/' && (file[-3]=='p' || file[-3]=='P')
&& (file[-2]=='d' || file[-2]=='D') && (file[-1]=='f' || file[-1]=='F'))

5 个答案:

答案 0 :(得分:2)

在C ++中,你无法访问负面的indizies。 您必须手动计算该元素的位置:

int s = file.size();
(file[s-3]=='p' || file[s-3]=='P')
&& (file[s-2]=='d' || file[s-2]=='D') 
&& (file[s-1]=='f' || file[s-1]=='F')

我假设该文件是C ++ - 字符串,如果它不是你必须使用其他方式来获取长度

您还可以使用构建字符串函数来简化代码:

int s = file.size();
if (s > 10 && file.find("http://") == 0 && file.substr(s-3, 3) == "PDF") //...

或者像其他评论一样使用Regex(可能是最好的方式)

答案 1 :(得分:1)

可能有不少C ++程序员在他们的工具箱中有bool endsWith(std::string const& input, std::string const& suffix)函数。

以不良方式编写此内容很容易。调用substr是导致此问题的常见原因。正则表达式的性能更差。这是一个避免临时和副本的实现:

bool endsWith(std::string const& input, std::string const& suffix)
{
  if (input.size() < suffix.size()) return false; // "a" cannot end in "aa"
  return std::equal(begin(suffix), end(suffix), end(input)-suffix.size());
}

答案 2 :(得分:0)

另一种解决方案是使用Regex

regex url("http//\w*pdf",icase);

答案 3 :(得分:0)

或者您可以使用正则表达式:

#import <regex>
using namespace std;

...

std::string str = "http://www.example.com/myFile.PDF";

std::regex rx("http(s)?:(www\.)?.+/[pP][dD][fF]");

return regex_match(str.begin(), str.end(), rx)

..

其中:

  • "http(s)? - 匹配http或https

  • (www\.)? - 匹配www的单个或0个幻影。例如'www.example.com'或'example.com'

  • .+/ - 匹配任何字符

  • /[pP][dD][fF] - url的结尾可以是小字母和大写字母的任意组合,形成单词'pdf'

您可以查看更多herehere

答案 4 :(得分:0)

使用各种字符串方法有很多不同的方法。如果你真的关心性能,你可以用各种方式进行基准测试。以下是find&amp; amp;的示例SUBSTR。

#include <algorithm>
#include <string> 

std::string file = "http://something.pdf";
std::transform(file.begin(), file.end(), file.begin(), ::tolower);  // lowercase the data, see http://stackoverflow.com/questions/313970/stl-string-to-lower-case

if (file.find("http://") == 0 && (file.substr(file.length() - 3) == "pdf")) {
  // valid
}