我尝试用C
编写简单的strcmp()
函数。但我总是Segmentation fault (core dumped)
。有什么问题?
char *arr={"abcdefg"};
char *a = arr[1];
if(strcmp(a, 'b') == 0)
{
printf("it is b \n");
}
答案 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");
}