2014-12-15 16 views
5

strcmp olmadan 2 karakter dizisi karşılaştırmak için bir yol arıyorum. Bu şekilde gitmek mi? Yoksa bir şey mi özlüyorum? Ne zaman derlediysem, eğer her ikisinde de aynı dizeleri yazarsam, program sıkışır ve hiçbir şey yapmaz. LÜTFEN YARDIM ET!Strcmp kullanılmadan Char dizisi karşılaştırma C

DÜZENLEME: BİR i değil, bir C olması gerekiyordu ÜZGÜNÜM

İşte
int compare_info(char *array1, char *array2) 
{ 

int i; 
i = 0; 

while(array1[i] == array2[i]) 
{ 
    if(array1[i] == '\0' || array2[i] == '\0') 
     break; 
    i++; 
} 

if(array1[i] == '\0' && array2[i] == '\0') 
return 0; 

else 
    return-1; 

} 
+2

Sorun, 'C++ 'dır. Har har. – wakjah

+4

İlk 'while'iniz sonsuz bir döngüdür. 'Array1 [i] 've' array2 [i] 'yi karşılaştırırsınız, ancak daha sonra döngü içinde hiçbir zaman değişmez. –

+2

'c' değişkenini nerede tanımlarsınız? –

cevap

3

Burada bir çözüm var, kodunuz gibi görünüyor ama bazı değişiklikler yaptım. Döngünün ortasındaki dönüşleri çıkardım çünkü yapıyı kırıyorlar, bu şekilde analiz etmek daha kolaydır. Son İşlem, ben süre için yeni bir koşul ekledi, böylece dize sonu bulunduğunda, döngü diğer cevaplara ek olarak

int compare_info(char *array1, char *array2) 
{ 
    int i; 
    int response = 0; 
    i = 0; 

    while(array1[i] == array2[i] && response == 0) 
    { 
     if(array1[i] == '\0' || array2[i] == '\0'){ 
      response = 1; 
     } 
     i++; 
    } 

    return response; 
} 
3

sahip

int compare_info(char *array1, char *array2) 
{ 
    if ((array1 == NULL) || (array2 == NULL)) 
     return 0; 
    while ((*array1 != '\0') && (*array2 != '\0') && (*array1 == *array2)) 
    { 
     array1++; 
     array2++; 
    } 
    return (*array1 == *array2); 
} 

ya da belki bu daha

int compare_info(char *array1, char *array2) 
{ 
    int i; 

    i = 0; 
    if ((array1 == NULL) || (array2 == NULL)) 
     return 0; 
    while ((array1[i] != '\0') && (array2[i] != '\0') && (array1[i] == array2[i])) 
    { 
     i++; 
    } 
    return (array1[i] == array2[i]); 
} 

gibi bir çözüm argümanları const yapabilir, çünkü sadece dizeleri karşılaştırmak istiyorsanız, bunu garanti edersiniz. işlev onları değiştirmeyecektir, yani compare_info(const char *array1, const char *array2)

+1

'strcmp()', birinci argüman ikincile karşılaştırıldığında düşük sıralanırsa negatif bir değer, ilk bağımsız değişken ikinci ile karşılaştırıldığında yüksekse pozitif bir değer ve eşitse sıfır değerini döndürür. Karşılaştırmanız ya 0 (doğru) ya da -1 (her zaman doğru değil) ile döner. –

+0

@JonathanLeffler Strcmp'yi taklit etmek istemediğini söylemedi, sadece dizgileri karşılaştırmak istiyor, dizeler eşleşmediğinde "0" dönecek ve aksi halde sıfırdan farklı olarak, dönüştürülmesi kolay olurdu strcmp' gibi bir değer döndüren bu işlevler yapar, ama bu sorunun problemi çözdüğünü düşünüyorum, elbette, yanılıyor olabilirim. –

+1

NULL parametrelerine yönelik ilk denetimler, 'true' (genellikle 'false' değil veya 0x01 veya 0x02 olarak tanımlanır) işlevine neden olur. Bu, arama programına çok yanıltıcı olabilir ve (muhtemelen) dizinin yalnızca biri değilse doğru olmaz pointer null içerir ve kesinlikle her iki dizi işaretçilerden de doğru değil NULL – user3629249

2

biter, ben strcmp, indeks olarak karışıma aşağıdaki eklersiniz hem strcmp olmadan:

int strcmp_nohdr (char *s1, char *s2) 
{ 
    if (!s1 && !s2) return 0; 
    if (s1 && !s2) return 1; 
    if (!s1 && s2) return -1; 

    while (*s1 && *s2 && *s1 == *s2) s1++, s2++; 

    if (!*s1 && !*s2) return 0; 
    else if (*s1 > *s2) return 1; 
    else return -1; 
} 

örnekler/çıktı:

$ strcmp_nohdr mydog mycat 

s1 is greater than s2 

$ strcmp_nohdr mybat mycat 

s1 is less than s2 

$ strcmp_nohdr mycat mycat 

s1 is equal to s2 

$ strcmp_nohdr mycat myca 

s1 is greater than s2 

$ strcmp_nohdr myca mycat 

s1 is less than s2 

bir başka Alternat aynı şeyi yapan çağrı ve montaj rutinleri olurdu. Kısa bir süre

+0

'strcmp_nohdr (NULL, NULL)' şeyler kilitleyecektir, değil mi? Bunu yapmak için hiç kimse aptalca olmaz ... :-) –

+0

Bana bu kodu açıklayabilir misin? : Burada ne dediğini tam olarak anlayamıyorum. – Silvestrini

+0

@Silvestrini Gösterilen kod, strcmp gibi çalışır (ptr 'NULL' değilse, ptr> NULL' bu kod için geçerli sayılır). –

0

:

int compare_info(char * array1, char * array2) 
{ 
    char * ptr1 = array1; 
    char * ptr2 = array2; 

    while(*ptr1 && *ptr2 && *ptr1++==*ptr2++); 
    if(!*ptr1 && !*ptr2 && *(ptr1-1)==*(ptr2-1)) return 0; 
    return -1; 
} 

iki dizileri aynı dönüş 0, başka bir geri dönüş -1

. (Bu strcmp eşit değil.)

0

aşağıdaki fonksiyon strcmp kesin davranışını taklit etmelidir: Ben programın çökmesi yoluyla (mümkün olduğunca erken boş işaretçileri yakalamak tercih etme eğilimindedir bazılarının aksine

int compare_info(const char* array1,const char* array2) 
{ 
    int i; 
    for (i=0; array1[i]!=0 && array2[i]!=0; i++) 
    { 
     if (array1[i] > array2[i]) 
      return +1; 
     if (array1[i] < array2[i]) 
      return -1; 
    } 
    if (array1[i] != 0) 
     return +1; 
    if (array2[i] != 0) 
     return -1; 
    return 0; 
} 
1

ve Bir hata ayıklayıcı), bu yüzden aşağıdaki boş göstericiler için herhangi bir çek kaçınmak. Başka bir deyişle, bu işlevlere boş gösterici iletmeyin.

str_neq fonksiyon şeritleri doğru mantık, koda dayalı olarak görünüyor ki, eşit olup olmadığını tespit eder (eşit değilse doğru/0/eşit false -1 dönüş):

int 
str_neq (const char *s1, const char *s2) 
{ 
    while (*s1 != '\0' && *s1 == *s2) 
    ++s1, ++s2; 
    return -(*s1 != *s2); 
} 

int 
str_compare (const char *s1, const char *s2) 
{ 
    while (*s1 != '\0' && *s1 == *s2) 
    ++s1, ++s2; 
    return *s1 - *s2; 
} 

umarım bu yardımcı olur: strcmp dönüş değerini hesaplar ifadesinde küçük bir değişiklik gerektirir aynı davranışı sağlamak! :-)

+0

Sadece kişisel tercihiniz var, ancak neden başka bir nedeniniz olabilir: - while (* s1! = '\ 0' ... 'sadece basit değilken (* s1 ...) İşaretçi ilerlediğinde null terminatör, her iki test de eşdeğerdir.Her uzun versiyonu tercih etmenizin bir nedeni var mı? –

+0

@ DavidC.Rankin Kısa versiyonu tercih ederim, ancak daha uzun bir versiyona açıklık getirmeyi tercih ettim. –