2017-04-22 186 views
0

当我明确声明一个字符串的值,然后将其与自身进行比较时,系统返回FALSE。这是否与系统添加的额外'\ 0'字符有关?我应该如何优化我的代码才能使其成为TRUE?C字符串长度

char name[5] = "hello"; 

if(name == "hello") 
{ 
    ... 
} 
+6

在C你不能比较这样的字符串,你在做什么是比较两个*指针*永远不会相等。阅读['strcmp'](http://en.cppreference.com/w/c/string/byte/strcmp)了解如何比较字符串。另外,请记住,字符串需要*终止*。包含5个字符的字符串需要包含终止符的*六个*字符的空间。这两个事实应该在任何[良好的初学者书](http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)。 –

+1

如果你打算使用'name'作为*字符串*,你需要'char name [6] =“hello”;''来保存''hello'(甚至更好'char name [] =“hello”;' 。为什么? (提示:你忘了'* 1'为* nul-terminating *字符':)'如果你不打算使用'name'作为*字符串,那么你知道你不能使用任何'string.h'函数期望以* nul结尾的字符串*作为参数。 –

+0

@ DavidC.Rankin我尝试过'char name1 [] =“hello”;'然后'char name2 [] =“hello”;'最后'strcmp(name1,name2)'但仍然是FALSE。怎么可以这么简单是如此令人沮丧... – reiallenramos

回答

5

你不能(有效)比较使用!===字符串,你需要使用strcmp这样做的原因是因为!===只会比较这些字符串的基址。字符串的不是内容。 不使用预定义的数组大小像char name[5] = "hello";而不是你可以使用char name[] = "hello";char name[6] = "hello";当使用

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

int main() 
{ 
char a[] = "hello"; 
char b[] = "hello"; 

    if (strcmp(a,b) == 0) 
     printf("strings are equal.\n"); 
    else 
     printf("strings are not equal.\n"); 

    return 0; 
} 
0

实际上,name是一个指向字符串“hello”地址的指针。你无法比较它们。所以你可以尝试使用strcmp函数。还包括string.h库。

喜欢:

strcmp(name,"hello"); 

也作为注释中的一个所指出的,采取的6字符数组包括“\0”。

希望有所帮助。

+0

_你不能比较他们 - 你可以! –

+0

我的意思是比较地址和字符串是没有意义的比较。 –

1

如果两个参数相等,则strcmp()返回0。

char name[]="hello"; 
if(strcmp(name,"hello") == 0) 
    return TRUE; 
else 
    return FALSE; 
+0

将'OP'定义的'name'传递给'strcmp()'会调用未定义的行为,因为'name' * * not *'0'-terminated。 – alk

+0

为变量“名称”添加了适当的定义 –

3

从我的评论继续,你需要char name[6] = "hello";持有'hello(加上NUL终止字符)更妙的是,你可以使用

char name[] = "hello"; 

这将正确初始化name含有6-字符(包括空字节)。

所有string.h功能期待空终止字符串作为参数时,他们采取char *const char *作为传递给函数的参数。

最后,正如Anuvansh的回答中指出的那样,您不能使用不等式条件来确定两个字符串是否相等或不同。您或者使用正常的比较函数strcmp,strncmp,memcmp,或者您在每个字符串中停留在字符串不同的第一个字符处,或者在空字节处漫游,如果这些字符串是相同的。

看看,让我知道你是否还有其他问题。祝你好运,你的编码。

0

在C中,数组名称实际上是指向该数组的第一个元素的指针。

if(name == "hello") 

你比较字符串指针所以它会返回false

你可以看到相同的概念本文 why is array name a pointer to the first element of the array?

你可以简单地包括“在:

你的情况

串。H”库和使用的strcmp()函数

这样的代码:

char name[]="hello"; 

if(strcmp(name,"hello")==0){ 

..... 

} 

,使其真实姿态

+0

将您的代码缩进4个字符以将其格式化为代码。 –

+0

“*您可以简单包含库*”在编译期间不使用C库,而是在*编译后链接*。 *包括*用于编译*是由库提供的函数的* prototype/s *。 – alk