+ -
当前位置:首页 → 问答吧 → 关于字符长度的诡异现象(已解决)

关于字符长度的诡异现象(已解决)

时间:2010-09-12

来源:互联网

本帖最后由 blackgenius 于 2010-09-12 13:48 编辑

我写了这么一段代码,测试字符串和字符数组的长度问题,测试strlen和sizeof函数的异同,结果有一处很不明白,先看程序
  1. #include <stdio.h>
  2. #include <string.h>

  3. int
  4. main()
  5. {
  6.     char str[5] = “12345”;
  7.     char *pstr;
  8.     int i;

  9.     void test(char str[5]);

  10.     pstr = "12345";
  11.     printf("In the main func\n");
  12.     for (i=0; i<5; i++)
  13.         printf("%c\n", str[i]);
  14.     printf("%s\n", pstr);
  15.     printf("sizeof(str[]): %d\n", sizeof(str));
  16.     printf("strlen(pstr): %d\n", strlen(pstr));
  17.     printf("For the array:\n");
  18.     test(str);
  19.     printf("For the pointer:\n");
  20.     test(pstr);
  21.     return 0;
  22. }

  23. void test(char str[5]) {
  24.     int s;
  25.     s = sizeof(str);
  26.     printf("%s\n", str);
  27.     printf("The value of sizeof func: %d\n", s);
复制代码
这个程序运行的结果如下:

下载 (18.98 KB)
CentOS系统
2010-09-12 12:53



首先,语句For the array: 之后跟的打印结果,结尾出现乱码是和原因?
其次,在array情况下,sizeof的值为什么会是4?<在pointer情况下sizeof的值为4是因为字符串只能用strlen去求长度,sizeof得到的会是指针本身的值的长度(long型)>
最后,为什么函数形参设为char str[5]型,对于字符数组,传参到函数之后,打印其sizeof的值时得到的是4?

高手指点迷津,小生谢过~


发现我太幼稚了,仔细查了一下,当我的函数用数组做形参时,等价于传递了数组的首地址给函数,意味着在函数中使用sizeof函数求得的都是等价于对字符串指针求sizeof,得到的是地址所占的空间大小,也就是一个long型的数据sizeof的大小。T T只笑自己太幼稚啊~哈哈!不过还请指点,Array情况下输出为什么出现了乱码?

作者: blackgenius   发布时间: 2010-09-12

sprintf不是那么用吧,

sprintf(char *str, const char *format,...)

作者: kingoftime3   发布时间: 2010-09-12

第一个问题,因为把12345装在str[5]里表示的不是一个合法的字符,后面应该还有一位'\0'

第二个问题,当数组当作函数参数时它就是一个指针

作者: kingoftime3   发布时间: 2010-09-12

回复 kingoftime3
跟那个没有关系

作者: blackgenius   发布时间: 2010-09-12

回复 kingoftime3

我也考虑是这一点,作为字符数组,是不需要'\0'的,只是作为字符串的时候才需要'\0'。这样考虑应该是对的,因为没有'\0'所以导致当传到函数中以%s输出时它不是一个合法的字符串,除了12345这五位之外,还把后面的内容输出了~我们考虑的应该是一样的,还是谢谢你~

作者: blackgenius   发布时间: 2010-09-12

相关阅读 更多