这个strcmp()有什么问题?

时间:2015-11-09 09:59:48

标签: c segmentation-fault strcmp

我尝试用C编写简单的strcmp()函数。但我总是Segmentation fault (core dumped)。有什么问题?

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

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

3 个答案:

答案 0 :(得分:3)

  

有什么问题?

你没有让编译器帮助你自己。

在GCC上使用-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,而不是{{1} (见上文)。

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] 和所有代码,以便我们可以复制&粘贴&编译,仍然有行号匹配。

答案 1 :(得分: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");
    }
}

答案 2 :(得分:0)

你在这里做了很多错事。 strcmp用于比较字符串。做你想做的最简单的方法是

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

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

如果您仍希望使用strcmp执行此操作,则需要通过将空终结符a附加到其中来使\0为字符串。

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

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