C ++ - char数组和空字符

时间:2012-04-21 08:17:21

标签: c++ arrays chat null-character

我有两个关于char数组的问题。

    从下面的代码
  1. 开始,因为arrconst,为什么编译器没有给我一个错误,因为我正在重写它?

    char arr[5]; // arr is a const pointer to (*)[5] array
    cin>>arr; //   
    
  2. 当我初始化这样的char数组时:

    char arr[5]={'h','i'};
    

    如果我这样做了:

    cout << arr << "something here \n"; 
    

    它会打印hisomething here。我以为它应该打印出来

    hi   something here
    

    有3个witespaces。

    但如果我这样做了:

    for(int i = 0; i < 5; i++){
      cout << arr[i];
    }
    

    打印出3个空格。

  3. 第二种情况似乎证明编译器不会添加任何空字符。那么编译器如何忽略3个空格呢?

4 个答案:

答案 0 :(得分:8)

  1. 此数组不是const,因为没有const限定符。
  2. 如果您未在初始值设定项列表中指定剩余值,则会将其初始化为00用于终止C字符串,而不是空格。
  3. 至于你的说法,for(int i=0;i<5;i++){ cout << arr[i]; }打印的空格 - 你是怎么检查的?

    对我来说:

    #include <iostream>
    
    int main(){
        char arr[5]={'h','i'};
        for(int i=0;i<5;i++){ std::cout << arr[i]; }
        std::cout << "X" << std::endl;
    }
    

    打印:

    hiX
    

    和hexdumped:

    $ ./t | hexdump -Cv
    00000000  68 69 00 00 00 58 0a                              |hi...X.|
    00000007
    

    打印了'\0'个字符。它们的显示似乎取决于操作系统。但它们不是空白。

答案 1 :(得分:3)

  1. arr本身是一个“char [5]”而不是“const char(*)[5]”。当你写cin&gt;&gt;时它被隐式地转换为“char *”rvalue。 ARR。它不是一个常数,因为它甚至不是左值。
  2. 并且“const char *”或“char const *”表示指向的左值不能更改,而“char * const”表示指针左值本身不能更改。但这与你的问题无关。

    1. 首先,没有空格。它是附加空字符的cin。

    2. 数组只是一个数组:

      char a[5]; //a's type is char[5];
      

      但是数组很难成为操作数。只有我记得接受数组类型的运算符是sizeof和&amp;(address-of)(另一方面,这意味着有时必须是一个数组。否则如果你写sizeof(a),它会给你指针的大小。对于其他操作,a转换为char * rvalue。是的,即使你写一个[0],一个[1]等等,a [0]相当于*(a + 0),它对指针进行操作但不对数组进行操作。

      当你无法分配某些东西时,并不总是意味着东西是“const”:

      1. 当然不能分配给const变量。
      2. 您只能分配给变量(或称为左值),因此您无法为rvalue(或aka值)分配内容。所以你不能写1 = 2,因为1是rvalue而不是变量,不是因为1是“const”。
      3. 您必须为与其类型匹配的变量指定内容。所以如果你有一个const char * p和一个char * q,你就不能写q = p。他们的类型不匹配。而且,它并不意味着q是常数,因为它显然不是。但是你可以编写p = q,因为char *可以隐式地转换为const char *。但是const char *必须明确地转换为char *。

答案 2 :(得分:0)

arr表示const指针,这意味着您无法将指针设置为另一个地址。它不是指向const的指针,因此您可以更改指针指向的地址处的数据。

示例:

arr=&another_variable; //Illegal
*arr='A';              //Legal

答案 3 :(得分:0)

  1. 第一个不是常数。第二,这段代码不安全。
  2. 你应该在最后设置终止符号'\ 0'。
  3. 你不应该使用char类型,尝试使用string而不是char数组。