如果我不给它一点额外的空间,字符串会变得疯狂.任何人都可以解释这里发生了什么?

Hyd*_*erA 36 c c++ string variables

首先,我想说我是C/C++的新手,我原本是一名PHP开发人员,因此我习惯于以任何我喜欢的方式滥用变量.

C是一个严格的国家,编译器在这里不太喜欢我,我习惯于违反规则来完成任务.

无论如何,这是我简单的代码:

char IP[15] = "192.168.2.1";
char separator[2] = "||";   

puts( separator );
Run Code Online (Sandbox Code Playgroud)

输出:

||192.168.2.1
Run Code Online (Sandbox Code Playgroud)

但是,如果我将定义更改separator为:

char separator[3] = "||";
Run Code Online (Sandbox Code Playgroud)

我得到了所需的输出:

||
Run Code Online (Sandbox Code Playgroud)

那么为什么我需要给男人额外的空间,所以他不和他面前的男人睡觉?

sha*_*oth 45

那是因为当separator长度被强制为2 时,你得到一个非空终止的字符串.

永远记住为null终止符分配一个额外的字符.对于一串长度,N你需要N+1字符.

一旦违反此要求,任何期望以null结尾的字符串(puts()包括函数)的代码都将遇到未定义的行为.

你最好的选择是不强迫任何特定的长度:

char separator[] = "||";
Run Code Online (Sandbox Code Playgroud)

将分配一个完全正确大小的数组.

  • 实际上,自己定义长度会让你成为一个糟糕的公民,因为你可能犯了一个错误,编译器不会. (23认同)
  • 将一些字符数组称为"非空终止字符串"与将某些灵长类指称为"非人类人"相同:) (5认同)

NPE*_*NPE 22

C中的字符串是NUL终止的.这意味着两个字符的字符串需要三个字节(两个用于字符,第三个用于表示字符串结尾的零字节).

在您的示例中,可以省略数组的大小,编译器将分配正确的存储量:

char IP[] = "192.168.2.1";
char separator[] = "||";
Run Code Online (Sandbox Code Playgroud)

最后,如果您使用C++而不是C编码,那么最好使用std::string.


Fra*_*itt 13

如果你还在使用C++,我建议使用std :: string类而不是C字符串 - 更容易,更容易出错的恕我直言,特别是对于具有脚本语言背景的人.