2016-03-18 31 views
0

Bir tek (enum Symbol {e,a,b,c,d}; ile oluşturulan) Simge okumak için >> operatörünü aşırı çalışıyorum: bunun yerine ne olduğunuaşırı strchr kullanma >>

istream & operator >> (istream & is, Symbol & sym) { 
    Symbol Arr[]={e,a,b,c,d}; 
    char ch; 
    is>>ch; 
    if (strchr("eabcd",ch)) 
    sym=Arr[ch-'e']; 
     else { 
     is.unget(); 
     is.setstate(ios::failbit); 
     } 
    return is; 
} 

Ama bu, bazı çöp (sayılar) okur < < aşırı yükümde yazdırmaya çalışırken bir segmentasyon hatasına yol açan, ne yapıyorum? Düzenleme: Oh, ve tabii ki iostream ve cstring dahil olmak üzere using namespace std; başlangıçta ekledim. ch olan

+0

Sadece merak etmek, hangi sorunu çözmek istiyorsunuz? – Incomputable

+0

Bu, bir üniversitede Nesne Programlama kursu için daha büyük bir projenin bir parçası, daha sonra bir ekleme tablosu ile onlarla ilgili işlemler yapmak için Semboller okumalıyım. –

cevap

1

Burada bir kaç yanlış var. İlk önce, düzeltmeyi düzeltelim. Sadece her zaman parantez kullanın. Ne ile dizilmiş olduğunu görmek çok zor:

istream & operator >> (istream & is, Symbol & sym) { 
    Symbol Arr[]={e,a,b,c,d}; 
    char ch; 
    is>>ch; 
    if (strchr("eabcd",ch)) { 
     sym=Arr[ch-'e']; 
    } 
    else { 
     is.unget(); 
     is.setstate(ios::failbit); 
    } 
    return is; 
} 

Tamam harika. Şimdi, kullanıcı 'a' gibi bir şey girerse ne olur. strchr başarılı ve sym = Arr[ch - 'e'] yapıyorsunuz. Ancak bu durumda, -4. Bu bir yerlerde tamamen rastgele bir hafıza parçası, yani çöp alıyorsun.

const char* options = "eabcd"; 
if (const char* p = strchr(options, ch)) { 
    sym = Arr[p - options]; 
} 

Ama bu tür korkunç: aslında strchr kullanmak için böyle bir şey yapmak gerekiyordu.

switch (ch) { 
    case 'e': sym = e; break; 
    case 'a': sym = a; break; 
    ... 
    default: 
     is.unget(); 
     is.setstate(ios::failbit); 
} 

Ayrıca, is >> ch başarısız olabilir ve bu kontrol etmediğinizde: Sadece anahtarını kullanarak öneririm. Yapmanız gerekenler:

istream& operator>>(istream& is, Symbol& sym) { 
    char ch; 
    if (is >> ch) { 
     switch(ch) { ... } 
    } 
    return is; 
} 
+0

Ama neden '-4' ve 1 değil? 'a' kodumdan sonra geliyor, strchr'in nasıl çalıştığını yanlış anladım mı? –

+0

@GizmoofArabia 'char's çıkarılıyor. Sayınız alakasız. – Barry

+0

@GIzmoofArabia, Hayır. Altyapıyı yaparken, 'a' - 'e' negatiftir, çünkü ASCII kod altyapısını gerçekleştiriyorsunuz. [ASCII kodları] 'na bir göz atın (http://www.asciitable.com/). Dec ve char sütunlarına bak. – Incomputable

0

ise 'a', ch - 'e' (97-101) aralık dışında dizi Arr erişmek yol açacaktır negatif bir sayı (-4), olacaktır. Bu tanımlanmamış davranışa yol açar.

Eğer sembolleri var yolu, bir switch deyimi kullanın gerekir:

Symbol Arr[]={a,b,c,d,e}; 

: Eğer Arr kullanmak istiyorsanız

switch (ch) 
{ 
    case 'a': 
     sym = a; 
     break; 

    case 'b': 
     sym = b; 
     break; 

    case 'c': 
     sym = c; 
     break; 

    case 'd': 
     sym = d; 
     break; 

    case 'e': 
     sym = e; 
     break; 

    default: 
    // Nothing to do 
    break; 
} 

, siz Arr tanımlamak gerekecektir Ardından diziye aşağıdaki gibi erişebilir ve

+0

''e' - ch' çalışmayacak çünkü' 'elemanları Arr, "a" dan "a" ye sıralı sırada değil. –

+0

@RemyLebeau, hatayı işaretlediğiniz için teşekkürler. Şimdi tamir edildi. –