2012-06-03 35 views
0

我有兩個char *引用,我試圖找出哪一個更少。我有的代碼是:在C++中使用char * s和strcmp函數

bool stringComparison::lessThan(char *s1, char* s2) { 
    int result = strcmp(*s1,*s2); 
    return result < 0; 
}; 

結果是不會產生小於0有史以來。我如何需要更改「int result」行來完成這項工作?

謝謝

+0

「我有兩個char *引用」 - 不,你沒有,你有兩個'char *'類型的值,即指向char的指針。目前沒有C++「參考」。我們希望's1'和's2'都指向一個nul結尾的C風格字符串的第一個字符,因爲這就是'strcmp'所要求的。 –

回答

5

strcmp用於比較字符串; * s1和* s2是字符。你應該用s1和s2調用strcmp(沒有星號)。

編輯:

這裏是strcmp

+0

如果我只有參考* s1和* s2是否有方法從中獲取字符串? – Stephen

+0

@ user1434066:你沒有*引用*,你有指針。 's1'大概指向一個字符串的第一個字符(一個由空字符''\ 0''結尾的字符序列)。給定這樣一個指針,'strcmp'可以通過索引或者通過提前指向指向連續字符的指針來訪問整個字符串。查看[comp.lang.c FAQ](http://c-faq.com/)(我知道你在做C++,但是你使用C++從C繼承的功能)。 –

0

s1s2都是字符串的引用。所以,你的代碼

int result = strcmp(*s1,*s2); 

應該讀

int result = strcmp(s1,s2); 

strcmp在線參考。

+0

's1'和's2'不是字符串。他們是指向字符串的指針。 –

+0

@KeithThompson - 's1'是'char *' - 一個指向字符串第一個字符的指針。如果它是'char **',那麼它將是一個指向字符串的指針。 's2'同上 –

+0

[C標準](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)7.1.1第1段對術語進行了定義:「指向字符串的*指針*是指向其初始(最低地址)字符的指針。「 char **是指向指針的指針,*不是指向字符串的指針。 –

0

您有比您告訴我們更多的問題或不同的問題。

在您向我們顯示的代碼中,s1s2參數的類型爲char*strcmp()函數需要char*類型的參數(實際上是const char*)。

如果您致電strcmp(*s1,*s2),那就試圖撥打strcmp,並帶有兩個參數char。如你所描述的那樣,這不會給你不正確的結果;它不會編譯。至少,你的編譯器應該抱怨類型不匹配。

如果你不具備任何<string.h><cstring>一個#include做,聲明該strcmp函數的頭,那麼它有可能是編譯器將無法識別不匹配 - 但調用未聲明的函數在C++無效。

確實,因爲其他答案都說你應該打電話strcmp(s1, s2)而不是strcmp(*s1, *s2) - 但這並不能解釋你描述的症狀。將呼叫更正爲strcmp()本身不會解決您遇到的所有問題。

我能想到的幾個可能的解釋:

  1. 您使用的是舊的編譯器不抱怨調用未申報的功能。獲得一個更新的編譯器,或使用使它更符合語言標準的選項調用編譯器。

  2. 您的編譯器正在產生警告(診斷不必是致命的),而您忽略它們。不要忽視警告。

  3. 出於某種原因,你決定加入自己的strcmp()函數的聲明,或許像int strcmp(char s1, char s2);。不要這樣做。如果您需要針對標準功能的聲明,請爲適當的標頭添加#include指令。

0

我可以推薦一個(可能)改進版本的函數嗎?這將修復對strcmp的調用,刪除不需要的result變量,並添加const正確性。

bool stringComparison::lessThan(const char *s1, const char *s2) 
{ 
    return strcmp(s1, s2) < 0; 
} 

如果stringComparison是一類我另一個const添加到函數定義的結束。