YiMingC 发表于 2019-4-19 17:17:18

关于strlen()

本帖最后由 YiMingC 于 2019-4-19 17:18 编辑

为什么代码第14行(代码如下)的'\0'加不加打印的结果都是一样的呢?
不是说strlen函数是以'\0'来判断是否结束的吗?(如图)
麻烦大家帮忙看看~


#include <stdio.h>
#include <string.h>
main()
{
      char a,ch;
      int b,i,j;
      for (i=0;i<5;i++)
      {
                printf("请输入%d句话:",i+1);
                for(j=0;(ch=getchar()!='\n');j++)
                {
                        a=ch;
                }
                a='\0';
      }

      b = strlen(a);
      printf("%d\n",b);
}

Croper 发表于 2019-4-19 17:26:40

https://fishc.com.cn/thread-132900-1-1.html
一个道理,因为那儿刚好就有个'\0'

jackz007 发表于 2019-4-19 18:29:14

本帖最后由 jackz007 于 2019-4-19 21:53 编辑

      楼主,你的字符数组已经严重越界了!
      char a,ch;
. . . . . .
      for (i=0;i<5;i++)
. . . . . .
                        a=ch;
      当 i > 1 的时候, a[ i ] 变已经越界,而你越界的区域并没有事先声明,因此也不会受到应有的保护,发生任何奇怪的事情也就不足为奇了。

Croper 发表于 2019-4-19 18:42:16

jackz007 发表于 2019-4-19 18:29
楼主,你的字符数组已经严重越界了!

      当 i > 1 的时候, a 变已经越界,而你越界的区 ...

可是楼主出现的这个问题跟越界一点关系都没有- -strlen(a)
strlen是a,再怎么也不会越界- -

ba21 发表于 2019-4-19 21:15:21

本帖最后由 ba21 于 2019-4-19 21:18 编辑

你对strlen的理解错了吧。
strlen所作的仅仅是一个计数器的工作,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')

char a; 有些编译器,会初始化a全部为0。有些不会。

代码也有问题,你代码也越界

YiMingC 发表于 2019-4-19 22:41:45

Croper 发表于 2019-4-19 17:26
https://fishc.com.cn/thread-132900-1-1.html
一个道理,因为那儿刚好就有个'\0'

后来又试了好几次,'\0'出现的频率这么高吗....{:5_96:} 越界的问题改过来了。

YiMingC 发表于 2019-4-19 22:50:21

ba21 发表于 2019-4-19 21:15
你对strlen的理解错了吧。
strlen所作的仅仅是一个计数器的工作,直到碰到第一个字符串结束符'\0'为止,然 ...

我是这样理解的:
strlen不是统计遇到'\0'之前的字符个数吗,字符数组对于我没有赋值的地方应该是有东西填充的,我想通过这个程序去验证一下这个想法,如果我想的是对的应该加不加'\0'对结果影响很大才对,但实际上一样...所以不太理解是怎么回事。

ba21 发表于 2019-4-19 23:29:34

YiMingC 发表于 2019-4-19 22:50
我是这样理解的:
strlen不是统计遇到'\0'之前的字符个数吗,字符数组对于我没有赋值的地方应该是有东西 ...

不是说得很明白了

char a; 有些编译器,会初始化a全部为'\0'。有些不会。

YiMingC 发表于 2019-4-19 23:33:40

ba21 发表于 2019-4-19 23:29
不是说得很明白了

char a; 有些编译器,会初始化a全部为'\0'。有些不会。

好吧,明白了,谢谢啦~
页: [1]
查看完整版本: 关于strlen()