我有一个我正在尝试实现的基本程序,要求输入.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'))
答案 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'
答案 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
}