2010-08-30 23 views
5

Bir dosyadaki yorumları kontrol etmek için karakter ilkesini, dizenin ilk öğesiyle karşılaştırmak istiyorum. Neden bir char kullanıyorsunuz? Bunu, yorum için bir karakter varlığını kabul eden bir işlev haline getirmek istiyorum. Bir dizeye izin vermek istemiyorum çünkü onu tek bir karakter uzunluğunda sınırlamak istiyorum.Karakter Literalını Std ile Karşılaştırma :: C++ içinde String

Bu düşünceyle, karaktere hitap etmenin ve std :: string'in karşılaştırma işlevine iletmenin kolay yolunun olacağını düşündüm. Ancak bu bana istenmeyen sonuçlar veriyor. aşağıdaki gibi

Benim kodudur:

#include <string> 
#include <iostream> 

int main (int argc, char *argv[]) 
{ 
    std::string my_string = "bob"; 
    char my_char1 = 'a'; 
    char my_char2 = 'b'; 

    std::cout << "STRING : " << my_string.substr(0,1) << std::endl 
     << "CHAR : " << my_char1 << std::endl; 
    if (my_string.substr(0,1).compare(&my_char1)==0) 
    std::cout << "WOW!" << std::endl; 
    else 
    std::cout << "NOPE..." << std::endl; 

    std::cout << "STRING : " << my_string.substr(0,1) << std::endl 
     << "CHAR : " << my_char2 << std::endl; 
    if (my_string.substr(0,1).compare(&my_char2)==0) 
    std::cout << "WOW!" << std::endl; 
    else 
    std::cout << "NOPE..." << std::endl; 

    std::cout << "STRING : " << my_string << std::endl 
     << "STRING 2 : " << "bob" << std::endl; 
    if (my_string.compare("bob")==0) 
    std::cout << "WOW!" << std::endl; 
    else 
    std::cout << "NOPE..." << std::endl; 
} 

beni verir ...

STRING : b 
CHAR : a 
NOPE... 
STRING : b 
CHAR : b 
NOPE... 
STRING : bob 
STRING 2 : bob 
WOW! 

Neden fonksiyon alt dize ve karakter aynı değildir düşünüyor. Chars ve std :: string vars'ı düzgün bir şekilde karşılaştırmanın en kısa yolu nedir?


kastettiğimi en kısa söylemek (benim soru önlemek yeniden sınıflandırılması .... atlamak için çekinmeyin kısa rant) o belagat kodlama için arzusu dışında. Lütfen, bu bir ev ödevi sorusu DEĞİLDİR. Ben bir kimya mühendisliği doktora adayıyım ve bağımsız araştırmanın bir parçası olarak kod yapıyorum. Son sorularımdan biri de, kullanıcı için msw (aynı zamanda bir snide yorumu) tarafından "ev ödevi" olarak yeniden sınıflandırıldı. Kodum başkaları tarafından yeniden kullanılıyor olabilir veya olmayabilir, ancak okumayı ve sürdürmeyi kolaylaştırmayı deniyorum. Ayrıca, kodumun mümkün olduğu kadar verimli hale getirilmesi konusunda da tuhaf bir istek duyuyorum. Bu nedenle verimlilik ve hünerle ilgili sorular.

if (my_string.substr(0,1).compare(&my_char2)==0) 
siz "kandırma" çünkü

Çalışmaz dize:

cevap

14

karşılaştırmak için kullanabilirsiniz boş sonlandırılmış bir C-dizgisine bir işaretçi olduğunu düşünerek. Bu programınızı çökertmek de dahil olmak üzere garip etkileri olacaktır. Bunun yerine, sadece my_char ile dizenin birinci karakteri karşılaştırmak için normal bir eşitlik kullanın:

if (my_string[0] == my_char) 
    // do stuff 
+5

Ayrıca 'my_string [0]' işlevine erişmeye çalışmadan önce '0

3

Bunu yapmak operatör [] dize tek bir char

// string::operator[] 
#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    string str ("Test string"); 
    int i; char c = 't'; 
    for (i=0; i < str.length(); i++) 
    { 
     if (c == str[i]) { 
      std::cout << "Equal at position i = " << i << std::endl; 
     } 
    } 
    return 0; 
} 
1

karşılaştırmak için ilk iki aramaların davranışı Her char adresini ne şu rastgele bellek içeriği tamamen bağlıdır. basic_string::compare(const char*)'u arıyorsunuz ve buradaki paramın tek bir karakter değil, bir C-String (boş sonlandırılmış) olduğu varsayılmaktadır. Compare() çağrısı, istediğiniz char'i, ardından bu char sonrası sonraki 0x00 bayta kadar olan her şeyi, std :: string el ile karşılaştıracaktır.

Otoh < < operatörünün char girişi için uygun bir aşırı yükü yok, bu nedenle çıktınız aslında burada karşılaştırdığınız şeyi yansıtmıyor.

Decl ve d'yi const char[] a = "a"; olarak dönüştürün ve ne olmasını istediğinizi elde edersiniz.

4

Dizginizdeki endeks işlecini neden kullanmıyorsunuz? Bir char tipi döndürecek.

if (my_string[0] == my_char1) 
1

Oldukça standart, C++ dizeleri null-sonlandırılır; karakterler değil.Yani standart karşılaştırma yöntemini kullanarak gerçekten "b \ 0" == 'b' olup olmadığını kontrol ediyorsunuz.

bunu kullandım ve istenen çıkış var: Bu ne söylediğini, alt dizenin 0 konumunda başlamak 1 uzunluğu kullanın ve uzunluğunda karakterim referans karşılaştırmak olduğunu

if (my_string.substr(0,1).compare(0, 1, &my_char2, 1)==0) 
    std::cout << "WOW!" << std::endl; 
else 
    std::cout << "NOPE..." << std::endl; 

1. 0_

+1

C++ dizgileri null sonlandırıldı. C de nihayet sonlandırıldılar, çünkü bunlar aslında char'a birer işaretçiydi. –

+0

@Draco: 'std :: string', null-sonlandırılmış (0x olarak değişiyor olsa da) gerekli değildir, ancak hala char null-sonlandırılmış dizisini varsayan C++ standardında bol yer vardır. Bu soruda gösterildiği gibi, std :: string' içinde birkaç yöntem içerir. –

İlgili konular