Как создать строку, если я знаю символы в каждом индексе (в c ++) - PullRequest
1 голос
/ 31 марта 2020

Я попытался напечатать созданную мной строку, но ее не существует. Как вы можете видеть, выходная длина показывает 0:

#include <iostream>
#include <string>
using namespace std;

int main(){
  string a="";
  a[0]='a';
  a[1]='b';
  a[2]='c';

  cout<<"length of a: "<< a.length();
}

Выход на консоль:

длина a: 0

Ответы [ 4 ]

2 голосов
/ 31 марта 2020

Ваш код имеет неопределенное поведение, потому что вы получаете доступ к элементам за пределами. Строка имеет size() (что совпадает с length()) 0, поэтому a[0] и другие элементы доступа не существуют.

Чтобы это работало, необходимо resize() первая строка.

Пример:

string a;
a.resize(3);
a[0]='a';
a[1]='b';
a[2]='c';

Вы также можете создать строку с правильной длиной напрямую:

string a(3, '\0'); // create a string of length 3 filled with \0 chars
1 голос
/ 31 марта 2020

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

Чтобы избежать этого, используйте resize() перед присвоением a, следующим образом

#include<iostream>
#include<string>
using namespace std;
int main(){
string a="";
a.resize(3);
a[0]='a';
a[1]='b';
a[2]='c';

cout<<"length of a: "<< a.length();
}

Или используйте push_back следующим образом

#include<iostream>
#include<string>
using namespace std;
int main(){
string a="";
a.push_back('a');
a.push_back('b');
a.push_back('c');

cout<<"length of a: "<< a.length();
}

Первое решение лучше второго, чтобы избежать перераспределения.

Также посмотрите это Почему "использование пространства имен std;" считается плохой практикой?

1 голос
/ 31 марта 2020

1) Эта string a=""; длина символа здесь равна 0, поэтому его размер также равен 0.

2)

a[0]='a';
a[1]='b';
a[2]='c';

это неопределенное поведение Вы получаете доступ за пределами

3) поэтому добавьте a.resize(3); к вашему коду, который

#include<iostream>
#include<string>

using namespace std;

int main()
{
string a="";
a.resize(3);  // this will resize 
a[0]='a';
a[1]='b';
a[2]='c';
cout<<"length of a: "<< a.length();
}

или string a="xxx"; сначала заполните несколько символов или используйте push_back(); как

a.push_back('a');
a.push_back('b');
a.push_back('c');
0 голосов
/ 31 марта 2020

Вам, вероятно, следует построить массив char, а затем вы можете использовать из строкового конструктора последовательности .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...