2014-02-08 83 views
0

昨天我在一次採訪中,要求寫一個函數來比較兩個字符串,基本上和strcmp()的輸出相同。我寫了下面的程序和compare()函數,但被告知錯誤。面試官說:「你比較從低字節到高字節的字符串,如果發生了字符串1有較小的低字節但高一些的字節,則你的代碼將輸出字符串1比字符串2小,這是錯誤的。」C中的這個字符串比較函數有什麼問題?如何比較字符串?

I我們認爲當我們進行字符串比較時,我們從左到右比較兩個字符串,並將每對相應字符與它們的ASCII值進行比較。我還發現了strcmp()的一些源代碼,並且嘗試了很多情況來將我的結果與strcmp()的結果進行比較,所以我認爲該程序是正確的。

我把我的程序寫在面試中。爲了進行比較,我打印了我寫的函數和strcmp()的值。我不得不說這不是很簡潔。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int compare (char *string1, char *string2, int length1, int length2); 

int main() 
{ 

int len1,len2; 
char *str1; 
char *str2; 
int result; 
int result1; 

//Input the string1 
printf("Please input the length of string1\n"); 
scanf("%d", &len1); 
str1=malloc(sizeof(char)*len1); 
printf("Please input string 1:\n"); 
scanf("%s",str1); 

//Input the string2 
printf("Please input the length of string2\n"); 
scanf("%d", &len2); 
str2=malloc(sizeof(char)*len2); 
printf("Please input string 2:\n"); 
scanf("%s",str2); 

//Do comparison, Both compare() and strcmp() are used 
result=compare(str1,str2,len1,len2); 
result1=strcmp(str1,str2); 
printf("\nThe result of compare() is: %d\n",result); 
printf("The result of strcmp() is:%d\n",result1); 


return 0; 
} 



int compare (char *string1, char *string2,int length1, int length2) 
//If string1>string2, return1; if string1<string2, return -1; if string1=string2, return 0 
{ 
int result=0; 

// Use the shorter length to do comprison bit by bit 
int length=(length1>length2)?length2:length1; 


for(int i=0;i<length-1;i++) 
{ 
    if(string1[i]>string2[i]) 
    { 
    result=1; 
    printf("%d\n",result); 
    break; 
    } 
    else if (string1[i]<string2[i]) 
    { 
    result=-1; 
    printf("%d\n",result); 
    break; 
    } 

} 


    if(result==1) 
    { 
    return 1; 
    } 
    else if (result==-1) 
    { 
    return -1; 
    } 
    else if (length1>length2) 
    { 
    return 1; 
    } 
    else if (length1<length2) 
    { 
    return -1; 
    } 
    else 
    { 
    return 0; 
    } 

} 

那麼,有誰能告訴我什麼是錯的程序?你能給我一個例子,比較()和strcmp()的結果不一樣嗎?

謝謝!

回答

1

你傳遞錯誤的字符串長度或者str1和str2的內存分配是錯誤的,導致scanf中的未定義行爲。

例如存儲器分配是:

str2 = malloc(sizeof(char) * len2); 

然後僅len2字符可以在陣列str2(包括NUL炭)和字符串長度可以是len2 - 1

我建議這樣做(閱讀評論):

int max_lenght = 128; // defined a constant 
str1 = malloc(max_lenght); 
printf("Please input string 1:\n"); 
fgets(str1, max_lenght, stdin); 
len1 = strlen(str1); // calculate length 

你並不需要檢查結果值,如果它是等於-1返回-1,如果爲0則返回0 ...只是不喜歡:

int result=0, i; // result is 0 
for(i=0; i < length-1; i++) 
{ 
    if(string1[i] > string2[i]) 
    { 
     result = 1; // result is 1 
     break; 
    } 
    else if (string1[i] < string2[i]) 
    { 
     result = -1; // result -1 
     break; 
    } 
} 
return result; // return what is result is 
    // comparison like if(result == -1) return -1 not needed 

中,其實還簡單:

for(result=0, i=0; i < length-1; i++){ 
    if(string1[i] == string2[i]) 
     continue; // just continue until equal 
    if(string1[i] > string2[i]) 
     result = 1; 
    else 
     result = -1; 
    break; // else break 
} 
return result; 
+0

所以你的意思是我已經忘記了內存'\ 0',對嗎? – Michael

+0

@Michael如果你輸入'len2'字符數然後調用scanf將導致未定義的行爲(和strcmp太) –

+0

你能解釋一下爲什麼它是未定義的行爲?我應該如何正確輸入一個字符串?我也用gets()來輸入字符串。但是我知道的是gets()不好,因爲gets()不檢查是否有足夠的內存。 – Michael