字符串-C++后显示的随机字符

Random characters displayed after string - C++

本文关键字:随机 字符 显示 -C++ 字符串      更新时间:2023-10-16

我使用带有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]"。我想知道为什么会发生这种事。

在C++中,当您使用字符数组作为字符串时,它必须以null结尾(以"\0"结尾(,这样我们才能知道它的长度。请尝试将char buf[BUF_SIZE]更改为char buf[BUF_SIZE+1],并在循环后添加buf[BUF_SIZE]=''

char字符串实际上只是C风格的以null结尾的字符串。添加''以终止它:

#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 ''
char a = 'a';
for (int i = 0; i < BUF_SIZE; ++i)
{
buf[i] = a;
a++;
}
buf[BUF_SIZE] = '';       // null terminate it
string s = buf;
cout << '[' << s << ']' << endl;
return 0;
}

输出:

[abcdefghij]

如果您只想将chars添加到字符串tho中,则可以直接在字符串上使用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;
}

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值之前,内存中存在随机值。