关于数组:C字符串长度 | 珊瑚贝

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 终止字符)更好的是,您可以使用

1
char name[] =“hello”;

这将正确初始化 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 中,数组名实际上是指向该数组第一个元素的指针。

在你的情况下:

1
if(name ==“hello”)

你比较指向字符串的指针,所以它会返回 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 库。

喜欢:

1
strcmp(name,“hello”);


也正如其中一条评论指出的那样,采用 6 的 char 数组来包含 \\’\\0\\’。

希望对您有所帮助。

  • 你不能比较它们——你可以!
  • 我的意思是比较地址和字符串不是有意义的比较。


来源:https://www.codenong.com/43556820/

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?