C string length
当我明确声明一个字符串的值,然后将其与自身进行比较时,系统返回 FALSE。这是否与系统添加的额外 \\'\\\\\\\\0\\' 字符有关?我应该如何改进我的代码以使其成为 TRUE?
1 2 3 4 5 6
| char name[5] ="hello";
if(name =="hello")
{
...
} |
- 在 C 中,你不能像这样比较字符串,你正在做的是比较两个永远不会相等的指针。阅读 strcmp 了解如何比较字符串。另外,请记住字符串需要终止。五个字符的字符串需要六个字符的空间来包含终止符。这两个事实都应该出现在任何一本好的初学者书籍中。
-
如果您打算将 name 用作字符串,则需要 char name[6] ="hello"; 来保存 'hello(甚至更好的 char name[] ="hello";)。为什么? (提示:您忘记了 +1 用于 nul 终止字符 :) 如果您不打算将 name 用作字符串 , then know you cannot use any of the string.h` 函数,该函数期望 *nul 终止字符串作为参数。
-
@DavidC.Rankin 我尝试了 char name1[] ="hello"; 然后 char name2[] ="hello"; 最后是 strcmp(name1, name2) 但仍然是错误的。这么简单的事情怎么会让人如此沮丧……
-
相关:stackoverflow.com/q/11399682/694576
-
(strcmp(name1, name2) == 0) 有效。我查看了文档。让我哑口无言。
-
@reiallenramos,这并不令人沮丧,这是正确的。如果字符串相等 if (strcmp(name1, name2) == 0) 则字符串相等 :)
-
将 char name[5] 更改为 char name[] - 让编译器为您计算正确的大小(PS:它不是 5)
-
@EdHeal char name[] ="hello"; 有效,但仅将其更改为 char name[]; 时,会出现错误。为什么是这样?
-
char name[] ="hello"; - 编译器被告知创建一个字符数组?它是什么内容/大小 - 它可以从 "Hello" 中找到。 char name[]。编译器如何找出大小。它不知道。
-
就目前而言,name 不是 C 字符串,因为它缺少 0 终止符,因为它被定义为只有五个 char 长。由于它不是 C-"字符串",因此将其传递给 str*() 函数系列的任何成员都会调用未定义的行为。
您不能(有用地)使用 != 或 == 比较字符串,您需要使用 strcmp 这样做的原因是因为 != 和 == 只会比较它们的基地址字符串。不是字符串的内容。
不要使用像 char name[5] ="hello"; 这样的预定义数组大小,而在使用
时可以使用 char name[] ="hello"; 或 char name[6] ="hello";
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include <stdio.h>
#include <string.h>
int main ()
{
char a [] ="hello";
char b [] ="hello";
if (strcmp(a ,b ) == 0)
printf("strings are equal.\
");
else
printf("strings are not equal.\
");
return 0;
} |
继续我的评论,您需要 char name[6] ="hello"; 来保存 'hello (加上 nul 终止字符)更好的是,您可以使用
这将正确初始化 name 以包含 6 个字符(包括 nul 字节)。
当所有 string.h 函数将 char * 或 const char * 作为参数传递给函数时,它们都需要一个以 nul 结尾的字符串作为参数。
最后,正如 Anuvansh 的回答中正确指出的那样,您不能使用不等式条件来确定两个字符串是否相等或不同。您要么使用普通的比较函数 strcmp、strncmp、memcmp,要么沿着每个字符串向下移动一个指针,该指针在字符串不同的第一个字符处停止,或者如果字符串相等,则在 nul 字节处停止。
如果您有任何其他问题,请仔细查看并告诉我。祝你的编码好运。
如果两个参数相等,则 strcmp() 返回 0。
1 2 3 4 5
| char name []="hello";
if(strcmp(name ,"hello") == 0)
return TRUE ;
else
return FALSE ; |
-
将 OP 定义的 name 传递给 strcmp() 会调用未定义的行为,因为 name 不是 0 终止的。
-
为变量"名称"添加了正确的定义
在 C 中,数组名实际上是指向该数组第一个元素的指针。
在你的情况下:
你比较指向字符串的指针,所以它会返回 false
您可以在本文中看到相同的概念
为什么数组名是指向数组第一个元素的指针?
您可以简单地包含 "string.h" 库并使用 strcmp() 函数
这样的代码:
1 2 3 4 5 6 7
| char name []="hello";
if(strcmp(name ,"hello")==0){
.....
} |
让它成为真正的
-
将代码缩进 4 个字符以将其格式化为代码。
-
"You can simple include library" C 中的库在编译时不使用,而是在编译后链接。编译所包含的内容是库提供的函数的原型。
其实name是一个指针,指向字符串"hello"的地址。你无法比较它们。所以你可以试试 strcmp 函数。还包括 string.h 库。
喜欢:
也正如其中一条评论指出的那样,采用 6 的 char 数组来包含 \\'\\0\\'。
希望对您有所帮助。
- 你不能比较它们——你可以!
-
我的意思是比较地址和字符串不是有意义的比较。