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

时间:2018-11-04 17:00:49

标签: c++ arrays codeblocks

我在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]”。我想知道为什么会这样。

3 个答案:

答案 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;
}