Почему эта программа отображает случайные символы? (C++)

Ну, не случайно, потому что каждый раз одно и то же, но

#include<iostream>
using namespace std;
int main()
{
    char box[10][10];
    for(int i=-1;i<11;i++)
    {
        cout<<"---------------------"<<endl<<"|";
        for(int j=0;j<10;j++)
        {
            cout<<box[j][i]<<"|";
        }
        cout<<endl;
    }
    intx;cin>>x;
    return 0;
}

выводит серию международных символов (ну, не все они "международные" как таковые, но я получаю такие вещи, как пи и испанский знак вопроса с перевернутыми буквами). В любом случае, я знаю, что это потому, что символы доступа к программе, которые не были инициализированы, но почему конкретные значения создают конкретные символы, каковы значения символов ASCII (если они имеют значения ASCII) и как я могу получить символы без сбоев моя программа?

5 ответов

Решение

Твой цикл закончился, я не имею смысла...

for(int i=-1;i<11;i++)

Это приведет к двум недопустимым индексам, -1 и 10, когда вы ссылаетесь здесь:

cout<<box[j][i]<<"|";

Это должно быть от 0 до < 10, как в другом цикле.

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

Сами символы, вероятно, являются расширенными ASCII, вы можете получить их через любую расширенную таблицу ASCII. Этот появился первым в Google. Например, вы можете сделать:

cout << "My extended ascii character is: " << (char)162 << endl;

получить сумасшедший международный o.

По той же причине, что

#include <iostream>
using namespace std;
int main()
{
   int x;
   cout << x;
}

отображает случайное значение. Неинициализированные переменные (или массивы) содержат мусор.

для (int i=-1;i<11;i++)

Эта линия подозрительна. -1 до 10? Должно быть от 0 до 9.

Символы, отображаемые программой, зависят от:

  • содержимое, которое оказывается в неинициализированных переменных, и
  • локаль вашего компьютера или кодировка, используемая в презентации.

Ссылка на Unicode, вероятно, будет лучшим источником для определения кодов, необходимых для отображения определенных символов.

Учтите, что ваши пользователи могут не иметь одинаковую кодировку (или шрифты с правильными символами), выбранные по умолчанию. Вы должны либо проверить текущую локаль, либо принудительно указать одну конкретную для вашего вывода, чтобы убедиться, что ваш вывод отображается так, как вы хотите.

ASCII-код

(int)(box[j][i])

Вы просто печатаете обычные chars, которые являются ASCII-символами с кодами от 0 до 255. При печати wchar_ts та же память интерпретируется как другие символы.

Ваш цикл должен быть в [0; 10[не в [-1; 11[

Другие вопросы по тегам