我在GCC编译器中使用代码块来输出包含数组的字符串,但是在打印字符串之后,在字符串的末尾会输出一个随机字符(每次我编译和编译程序时,字符都会改变)。
我的代码:
#define BUF_SIZE 10
char buf[BUF_SIZE];
char a = 'a';
for (int i=0; i<BUF_SIZE; ++i)
{
buf[i]= a;
a++;
}
string s = buf;
cout << '[' << s << ']' << endl;
输出:
[abcdefghij"
]
我也想知道为什么右方括号要换行。我希望输出只是“ [abcdefhij]”。我想知道为什么会这样。
答案 0 :(得分:3)
在C ++中,当您使用字符数组作为字符串时,它必须以空值结尾(以'\ 0'结尾),以便我们知道它有多长。尝试将char buf[BUF_SIZE]
更改为char buf[BUF_SIZE+1]
,并在循环后添加buf[BUF_SIZE]='\0'
。
答案 1 :(得分:3)
C字符串以null终止,这意味着它们以0值终止。
在这种情况下,如果要输出字母表的前10个字符,则需要考虑此空终止符。
有几种方法可以解决此问题,但是首先需要做的是考虑缓冲区中的多余字符:
#define BUF_SIZE 10
char buf[BUF_SIZE + 1];
取决于您的编译器,该缓冲存储器可能已经初始化为0,但是最好永远不要做任何假设。
将缓冲区的最后一个值设置为0,以终止字符串:
buf[BUF_SIZE] = 0;
然后,您可以继续执行已经编写的代码的其余部分,并且可以仅将char数组输出为字符串。
char a = 'a';
for (int i=0; i<BUF_SIZE; ++i) {
buf[i]= a;
a++;
}
cout << '[' << buf << ']' << endl;
重要的是将字符串的末尾设置为0。将char数组转换为字符串时,此值可能已损坏,并且在内存中出现随机值,然后才变为0。
答案 2 :(得分:2)
char
字符串实际上只是C样式的以null结尾的字符串。添加'\0'
以终止它:
#include <iostream>
#include <string>
using namespace std;
int main() {
const size_t BUF_SIZE = 10; // consider size_t
char buf[BUF_SIZE + 1]; // +1 to make room for '\0'
char a = 'a';
for (int i = 0; i < BUF_SIZE; ++i)
{
buf[i] = a;
a++;
}
buf[BUF_SIZE] = '\0'; // null terminate it
string s = buf;
cout << '[' << s << ']' << endl;
return 0;
}
输出:
[abcdefghij]
如果您只想在字符串中添加char
,则可以在字符串上直接使用push_back
:
#include <iostream>
#include <string>
using namespace std;
int main() {
const size_t BUF_SIZE = 10;
string s = "";
char a = 'a';
for (int i = 0; i < BUF_SIZE; ++i)
{
s.push_back(a++); // increments a and returns the previous value
}
cout << '[' << s << ']' << endl;
return 0;
}