2015-11-09 55 views
-3

我嘗試用strcmp()寫簡單的C函數。但我總是得到Segmentation fault (core dumped)。哪裏不對 ?這個strcmp()有什麼問題?

char *arr={"abcdefg"}; 
char *a = arr[1]; 

if(strcmp(a, 'b') == 0) 
{ 
    printf("it is b \n"); 
} 
+7

''b''屬於'char'類型。它應該是''「b」'。 –

+0

''b''是一個字符。 'strcmp'需要一個字符串(所以'char *')。 – hexasoft

+4

「a」並不指向您認爲它指向的位置。如果編譯器在您製作此代碼時不發出警告,則需要啓用更多警告。 –

回答

3

有什麼不對?

你沒有讓自己得到編譯器的幫助。

使用海合會-Wall -Wextra(這絕不是你可以得到最好的,而是你應該總是使用最低限度的),我得到:

testme.c: In function ‘main’: 
testme.c:6:11: warning: initialization makes pointer from integer without a cast [enabled by default] 
char *a = arr[1]; 
     ^

你把arr[1] - 這是char'b' - 和將它變成char *。您的a現在指向地址爲0x62(假設爲ASCII)的任何地址,這絕對不是您想要的。你可能想要&arr[1]arr + 1

或者你想一個char - 那麼你不應該申報char *,並strcmp()將首先使用錯誤的事情。

testme.c:8:1: warning: passing argument 2 of ‘strcmp’ makes pointer from integer without a cast [enabled by default] 
if(strcmp(a, 'b') == 0) 
^ 
In file included from testme.c:1:0: 
/usr/include/string.h:144:12: note: expected ‘const char *’ but argument is of type ‘int’ 
extern int strcmp (const char *__s1, const char *__s2) 
      ^

strcmp()需要兩個C字符串(char const *)。您的第二個參數'b'的類型爲int ...您可能需要"b"

仍然不是比較平等的,因爲"bcdefg"不等於"b" ...

或者你想一個字符的比較......這將是if (a == 'b')然後,用a存在char類型,不是char *(見上文)。

testme.c:10:5: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration] 
    printf("it is b \n"); 
    ^
testme.c:10:5: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default] 

請做我們發佈完整代碼的所有的青睞,包括int main()和所有的,所以我們可以複製粘貼& &編譯,仍然有行號的比賽。

0

我覺得這是你一直在努力實現的目標:

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

int main(void) 
{ 
    char *arr = {"abcdefg"}; 
    char a = arr[1]; 

    if(a == 'b') 
    { 
     printf("it is b \n"); 
    } 
} 
0

你在這裏做了很多錯誤的事情。 strcmp用於比較字符串。做你想做的最簡單的方法是

char *arr= {"abcdefg"}; 
char a = arr[1]; 

if(a == 'b') 
{ 
    printf("it is b \n"); 
} 

如果你仍然想strcmp做到這一點,你需要通過追加空終止\0它使a的字符串。

char *arr= {"abcdefg"}; 
char a[] = {arr[1], '\0'}; 

if(strcmp(a, "b") == 0) 
{ 
    printf("it is b \n"); 
}