昨天我在一次採訪中,要求寫一個函數來比較兩個字符串,基本上和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()的結果不一樣嗎?
謝謝!
所以你的意思是我已經忘記了內存'\ 0',對嗎? – Michael
@Michael如果你輸入'len2'字符數然後調用scanf將導致未定義的行爲(和strcmp太) –
你能解釋一下爲什麼它是未定義的行爲?我應該如何正確輸入一個字符串?我也用gets()來輸入字符串。但是我知道的是gets()不好,因爲gets()不檢查是否有足夠的內存。 – Michael