Случайные символы отображаются после строки - C ++ - PullRequest
0 голосов
/ 04 ноября 2018

Я использую кодовые блоки с компилятором 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 голосов
/ 04 ноября 2018

char строки - это на самом деле строки с нулевым окончанием в стиле C. Добавьте '\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 s в строку 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;
}
0 голосов
/ 04 ноября 2018

C-строки завершаются нулем, что означает, что они заканчиваются значением 0.

В этом случае, если вы хотите вывести первые 10 символов алфавита, вам необходимо принять во внимание этот нулевой символ завершения.

Есть несколько способов сделать это, но первое, что вам нужно сделать, это учесть дополнительный символ в вашем буфере:

#define BUF_SIZE 10
char buf[BUF_SIZE + 1];

В зависимости от вашего компилятора эта буферная память уже может быть инициализирована нулями, но лучше никогда не делать предположений.

Установить последнее значение буфера равным 0, чтобы завершить строку:

buf[BUF_SIZE] = 0;

Затем вы можете продолжить работу с оставшимся кодом, который вы уже написали, и вы можете просто вывести массив символов в виде строки.

char a = 'a';
for (int i=0; i<BUF_SIZE; ++i) {
    buf[i]= a;
    a++;
}

cout << '[' << buf << ']' << endl; 

Важно просто установить конец строки равным 0. Когда вы приводили свой массив символов в строку, это значение, вероятно, было повреждено, и в памяти были случайные значения, прежде чем оно достигло этого значения 0.

0 голосов
/ 04 ноября 2018

В C ++, когда вы используете массив символов в качестве строки, он должен заканчиваться нулем (заканчиваться на '\ 0'), чтобы мы знали, как долго это будет. Попробуйте изменить char buf[BUF_SIZE] на char buf[BUF_SIZE+1] и добавить buf[BUF_SIZE]='\0' после цикла.

...