为什么字符串终止不会发生在null字符处

时间:2014-10-23 15:14:13

标签: c string null char

为什么在第二个字符串中打印空字符?

声明字符数组应该在结尾处自动添加空字符。这取决于编译器吗?

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

bool ChckStrng(char *str);

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



  printf("a:%d\n", ChckStrng(a));
  printf("b:%d\n", ChckStrng(b));

}

bool ChckStrng(char *str)
{
  int count[26];

  while(str != NULL)
  {
    printf(":%d:\n", *str - 'a');
    if(++count[*str - 'a'] > 1)
     return false;
    str = str + 1;
  }
  printf("end\n");
  return true;
}

输出1:

:7: :4: :11: :11: A:0

0: :1: :2: :-97: :-97: B:0

4 个答案:

答案 0 :(得分:5)

您在这里比较指针,换句话说,如果str设置为NULL

while(str != NULL) /* str holds the address of a char */

您需要将字符与空终止符进行比较,换句话说,检查字符str 指向是否为空终止符:< / p>

while(*str != '\0')

答案 1 :(得分:3)

您正在比较指针本身的值而不是值指针指向的值。

  while( *str != '\0' )
  {

没有区别:*str\0,这是一个空字符。

NULL是空指针,不是空字符。

答案 2 :(得分:3)

str是一个保存地址的指针* str保存值

 bool ChckStrng(char *str)
    {
       int count[26];

       while(*str != '\0')
       {   
          printf(":%d:\n", *str - 'a');
          if(++count[*str - 'a'] > 1)
             return false;
          str = str + 1;
       }   
       printf("end\n");
       return true;
    }

答案 3 :(得分:1)

指针与字符不同。在&#39; C&#39;字符数组的空终止由ascii值0或NUL

表示