2014-02-06 3 views
0

У меня есть рудиментарная программа, которую я пытаюсь реализовать, которая запрашивает URL-адрес .pdf-файла, а затем загружает его и показывает его через Xming. Во-первых, я хочу проверить, чтобы пользователь действительно размещал URL с «http: //» спереди и «pdf» или «PDF» в конце. Я предполагаю, что это может быть типичной проблемой для кого-то из Python, но как проверить конец строки, которую вводит пользователь. Используя метод ниже (который я использовал с моей Python-ориентированного мозга) я получаюКак проверить конец строки на C++?

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')) 

ответ

2

В C++ вы не можете получить доступ к отрицательным индезиям. Вы должны вручную вычислить положение Laste элемента:

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, как еще один комментарий предложил (вероятно, самый хороший способ)

0

Другим решением является использование Regex.

regex url("http//\w*pdf",icase); 
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\.)? - соответствует один или 0 откровении WWW , такие как «www.example.com» или «example.com»

  • .+/ - соответствует любому символу

  • /[pP][dD][fF] - конец URL может по любой комбинации малых и прописных букв, которые образуют Whe слово " PDF»

Вы можете проверить более here и here

0

Там куча разных способов, с помощью различных методов строки. Если вы действительно заботились о производительности, вы можете сравнить различные способы. Вот пример с поиском & 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 
} 
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()); 
} 
Смежные вопросы