Может ли кто-нибудь объяснить странное поведение массива символов kchar1 в примере программы C ++ ниже - PullRequest
0 голосов
/ 24 января 2020

Я новый программист на С ++ и столкнулся с поведением массива символов, которое не могу объяснить. Для меня это просто учебное упражнение.

Я понимаю, почему kchar и kchar1 отображаются так, как они отображаются для значений j, равных от 0 до 5, но не могу понять, почему k1 отображает дополнительные символы, когда j = 6 и 7 Я также не могу объяснить, почему kchar отображает значение 7 для kchar [0], когда j = 7.

Заранее спасибо.

Ken_SF

выход наблюдается для j = 6 и 7:

j = 6 k: '10111010' k1: '012345610111010'

j = 7 k: '70111011' k1: '012345670111011'

конечный вывод, код показан ниже:

#include <iostream>
#include <windows.h>

using namespace std;

int main(){

char buf[] = "101110111101110111011110110111011101101110111011101110111110111011101110111011011";
char kchar[] = "00000000";//interesting kchar[7]; gives weird results when you display kchar for many iterations
char kchar1[7];
    for (int j = 0 ; j < 8 ; j++){
            kchar[j] = buf[j];
            kchar1[j] = j + '0';
             cout << "j = " << j << endl;
             cout << "k : '" << kchar << "'" << endl;
             cout << "k1: '" << kchar1 <<  "'" << endl;
             cout << endl;
  }
system("pause");
return 0;
}

1 Ответ

0 голосов
/ 24 января 2020

Просто ваша программа выполняет неопределенное поведение: потому что kchar1 имеет 7 элементов, но ваш l oop повторяется до j = 7, поэтому kchar1[7] является неопределенным поведением, поэтому вы получаете недопустимый символ. Таким образом, последний символ в kchar1 - это kchar1[6], а не kchar1[]7.

  • Также существует еще одно неопределенное поведение: kchar1 должен иметь символ нулевого терминатора \0 как последний элемент:

    // inside loop:
    if(j < 7 - 1)
        kchar1[j] = j + '0';
    kchar1[6] = '\0';
    
...