2016-04-07 51 views
1

Kullanıcının girdiği dizeye bağlı olarak farklı işlevleri çağırmak için fgets kullanmaya çalışıyorum. Biliyorum, daha sonra strtok kullanmam gerekecek, çünkü "12 yükü" için boşluk olacak. Ama şimdi, girdi olan dizeleri karşılaştırmak için strcmp kullanma konusunda kafam karıştı. Ben strcmp bu gibi kullanılabilir biliyorum:strcmp'i bir boole olarak kullanabilir miyim?

int check; 
char string[10] = "test"; 

check = strcmp(string, "test"); 
// Check will be 0 if true 

if (check == 0) 
{ 
    printf("same string\n"); 
} 
else 
{ 
    printf("not the same\n"); 
} 

doğru ve yanlış gibi bir mantıksal değerdir olabilir mi? "Test" aslında "test" ise, boole değeri true olur, o zaman boolean değerini if ifadelerinde kullanacağım. Her iki dizeleri aynı olup olmadığını

+0

yazma anlamına geliyordu. 'check' bir tamsayıdır ve başka bir tam sayı ile karşılaştırır. – Barmar

+0

Evet, ancak boolean bağlamında strcmp' dönüş değeri true (sıfır olmayan değer) olur, eğer dizeler ** farklıysa ** ve false değilse… === 0'. –

+1

Eğer FALSE sadece mantık ters olacak, ama fonksiyon mutlaka '1', sadece pozitif değer döndürmez, bu nedenle (eğer' kullanamaz 'boole değerleri' TRUE karşı test etmek ve isterseniz strcmp doğru (dize, "test") ==) ' –

cevap

1

if (strcmp(string, "test") == 0) kontrol edecektir.

strcmp(..) dönüş değeri bir tamsayıdır ve her iki dizginin aynı olması durumunda, dönüş değeri 0 tamsayısıdır. Yani etkili bir şekilde 0 == 0 ile karşılaştırabiliyorsunuz ve bu yüzden tamam.

bool are_equal(char* a, char* b) 
{ 
    return strcmp(a, b)==0; 
} 
2

. Boole denetimleri için, c'deki tamsayı 0'dan başka her şey true olarak sayılır ve tamsayı 0 false olarak kodlanır.

Yani evet, yaklaşımınız çalışacaktır.

1

strcmp() dizeleri eşit bir tamsayı değeri 0 döndürür: Sen yazmak ve bu hedefe, böyle bir şey ulaşmak için bir sarıcı/yardımcı işlevini kullanabilirsiniz

+1

Bu cevap. – haccks

0

strcmp ve diğer bu tür fonksiyonları ile sorun, C bir boolean türü yoktu onlar zamanda geriye gitmek olmasıdır. Böylece, ilk dizgenin ikincisinden daha büyük veya daha küçük olmasına bağlı olarak "eşit değil", sıfırdan daha büyük veya daha küçük bir tamsayı numarası olarak tanımlarlar. strcmp uygulanması İçinde, durumda dizeleri eşit olmazlar

int strcmp(const char *s1, const char *s2) 
{ 
    ... 
    if(*s1 != *s2) 
    { 
    return *s1 - s2* 
    } 
    ... 
    return 0; 
} 

gibi bir şey bulabilir, fonksiyon olmayan ilk eşit karakterler için sembol kodları arasındaki farka eşit herhangi bir sayıda, döndürebilir buldum.

Sen strcmp etrafında tasarlayarak sarmalayıcıları tarafından bu çözebilir:

inline bool is_equal (const char* s1, const char* s2) 
{ 
    return strcmp(s1, s2) == 0; 
} 

inline bool is_greater (const char* s1, const char* s2) 
{ 
    return strcmp(s1, s2) > 0; 
} 

inline bool is_less (const char* s1, const char* s2) 
{ 
    return strcmp(s1, s2) < 0; 
} 

Ve görünüyordu olarak şimdi, strcmp 'in dönüş değeri özgün tanımı kadar aptal olmadığını fark edebilirsiniz bunun nedeni onlar bsearch için karşılaştırma fonksiyonları yazarken çok kullanışlı olan 3 yerine 1 fonksiyonunu bir boolean olarak kullanmadığınız qsort vb

İlgili konular