2010-11-21 27 views
0

Aşağıdaki kodu çalışmıyor ki:dize :: -1 değeri dönen bulmak 0 [C++]

string line; 
string line_sub; 
size_t open_tag_start; 
const string open_tag = "<image>"; 
const int open_len = open_tag.length() + 1; 

open_tag_start = line.find(open_tag); 
line_sub = line.substr(open_tag_start, open_len); 

Bu kodu çalıştırmayı denediğinizde Ben line.find hat değişken open_tag_start için -1 değeri döndürmesi nedeniyle bu hata oluştuğunu anladım

 
terminate called after throwing an instance of 'std::out_of_range' 
what(): basic_string::substr 
Aborted (core dumped) 

: aşağıdaki hatayı alıyorum. 0 değerini open_tag_start değişkenine kodlayarak sorunu düzeltebilirim, ancak bu satırın herhangi bir noktasında etiketi bulabilen genel bir algoritmaya ihtiyacım var, bu yüzden bir değişken olmalı. Burada yanlış yaptığımı kimse görebilir mi?

İşte daha fazla bilgi. Bu kod ile

Amacım aslında bir dize içeriyor mu, hangi string line bir string line_sub ayıklamak ve ben size_t open_tag_start = 0 ayarladığınızda, ben derlemek ve kod yürütmek ve beklenen çıkışı gözlemlemek mümkün duyuyorum eğer. line boş değil ve sorunum ben

line_sub = line.substr(0, open_len); 

ile

line_sub = line.substr(open_tag_start, open_len); 

değiştirdiğinizde benim sorun çözülüyor ve ben derlemek ve kod yürütebilir olmasıdır.

Bu, programın yalnızca sorunlara neden olan parçaları içeren kısa bir sürümüdür. Bu kodun derlenmeye çalışılması, yukarıda ayrıntılandırılan hata mesajını verecektir. Kodun bir kısmı dışarı bıraktım sürece dosya rss.xml ders find başarısız öylesine line, boş bir dize, engadget.com http://www.engadget.com/rss.xml

#include <iostream> 
#include <string> 
#include <sstream> 
#include <fstream> 
#include <cstring> 
using namespace std; 

void get_tag_contents(ifstream& rssfile, string line, string open_tag); 

int main() 
{ 
    const string open_tag = "<image>"; 

    ifstream rssfile; 
    rssfile.open("rss.xml"); 
    string line; 

    getline(rssfile, line, '\n'); 
    get_tag_contents(rssfile, line, open_tag); 

    return 0; 
} 

void get_tag_contents(ifstream& rssfile, string line, string open_tag) 
{ 
    const int open_len = open_tag.length() + 1; 
    size_t open_tag_start; 
    string line_sub; 

    open_tag_start = line.find(open_tag); 
    line_sub = line.substr(open_tag_start, open_len); 
} 
+0

Lütfen sorunu derleyen ve gösteren kısa, kendi kendine yeten bir program gönderin. Kaydettiğiniz herhangi bir kodda eksik olduğumuz önemli bir ayrıntı var. –

+0

Soruyu koduyla güncelledim. –

cevap

3

için RSS beslemesi olduğunu. Bu hata, sizin de find işlevinin — işlevinin hepsi değil!

Yan not olarak, C++ dizeleri kullanırken '\0' telafi etmeniz gerekmez. + 1'dan kurtulun.

+2

... ve size_t imzasız olduğundan, '-1' döndürmüyor, string :: npos' döndürüyor. – bgporter

+0

@bgporter - Bununla birlikte, string :: npos, standart olarak -1 değerine sahip olarak tanımlanır. –

+1

@PigBen: Teknik olarak, "size_type" olarak görülebilen değerler aralığının dışında -1 değerine sahip olmak - tanımlanamaz - tanımlanamaz. '-1' bir başlatıcısı ile bir 'size_type' olarak tanımlanmıştır, bu yüzden '-1' _after_ dönüşümünün büyük bir pozitif sayı olan' size_type 'değerine sahiptir. –

2

Dizede alt dizgi bulunmuyorsa, find() yöntemi, -1 değeri için size_type olan std::string::npos değerini döndürecektir. substr()'u open_tag_start eşit -1 ile aradığınızda, out_of_range hatasını atan şey budur.

+2

Tehcnically, bir 'std :: string :: size_type'' -1' değerini alamaz çünkü işaretsiz bir türüdür. 'std :: string :: npos',' size' türünde ''' 'ile aynı olan' '' '' '' '' 'ile aynı' 'dır. –

+0

Sorumu yanlış yazdım ve bazı şeyleri daha net hale getirmek için bir güncelleme sundum. –

0

line'un <image> içerdiğinden emin misiniz? Dikkate alınması gereken bir şey, <ImaGe>'un bir şekilde büyük harfle yazılabilmesidir. Ayrıca, ne yapmaya çalıştığınızı tam olarak göremiyorum, çünkü line_sub (kodunuzun çalışması göz önünde bulundurulduğunda) enter code here'u ve bundan sonraki sonraki karakteri döndürecektir. Neyi başarmaya çalışıyorsun?

Dönüş değerlerinizi dezenfekte etmeyi unutmayın. -1 değerini bulursa, sorunla uğraşın veya bir hata atın.

1

Diğerlerinin de belirttiği gibi, , aramasının, arama başarısız olduğunda find() öğesinin dönüş değerini kontrol etmelisiniz.

std::string line("this is <image> a test"); 
std::string line_sub; 
const std::string open_tag = "<image>"; 

size_t open_tag_start = line.find(open_tag); 

if (open_tag_start != std::string::npos) 
{ 
    line_sub = line.substr(open_tag_start, open_tag.length()); 
} 

std::cout << line << "\n" << line_sub << "\n";