Я объявляю 2 строки строкового типа, которые s, s1. Я использую строку с ‘Cin’
и я вставляю 3 значения в s1. Затем я печатаю cout, но он не может печатать строку.
Вот мой код
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
string s,s1;
cin>>s;
s1[0]=s[1];
s1[1]=s[2];
s1[2]=s[3];
s1[3]='\0';
cout<<s1<<endl;
return 0;
}
с1 не было пусто …. cout<<s1[0]<<s1[1]<<s1[2]
и посмотреть.
Почему s1 не может печатать?
Вероятно, самый простой способ выполнить задачу OP — это использовать библиотечную функцию, такую как зиЬзЬг () которая заботится обо всех деталях, в которых отсутствует опубликованный код (и уже указано):
управление памятью. Вторая строка s1
пусто, поэтому попытка записать свои первые четыре (нераспределенных) элемента является неопределенным поведением. В общем, s1
следует изменить размер до необходимой длины.
нулевой терминатор. std::string
может управлять своим внутренним представлением и всегда возвращает строку с нулевым символом в конце через свои функции-члены c_str а также данные (начиная с C ++ 11).
Вот как это можно сделать:
#include <iostream>
#include <string>
int main()
{
std::string s;
std::cin >> s;
std::string s1;
std::string::size_type start_pos = 1,
count = 3;
if ( s.size() > start_pos )
s1 = s.substr(start_pos, count);
std::cout << s1 << '\n';
}
s1
не имеет никаких символов Вы пытаетесь изменить значение символов, которые не существуют.
Ваша программа имеет неопределенное поведение и может так же легко открыть зоопарк ламы, изменить полярность магнитного поля Земли или решить проблему холодного синтеза в ванне.
s1
правильный размер, прежде чем что-то писать;'\0'
к концу; это не строка C; в этом нет необходимости. Строки C ++ заботятся о себе.Вот пример:
#include <iostream>
#include <cassert>
int main()
{
std::string s, s1;
std::cin >> s;
assert(s.size() >= 4);
s1.resize(3);
s1[0] = s[1];
s1[1] = s[2];
s1[2] = s[3];
std::cout << s1 << std::endl;
}
Вы не можете назначить как s1 [0] = s [1]
Правильным способом является использование функции назначить как:
string s,s1;
cin>>s;
s1.assign(s.begin()+1,s.begin()+4);
cout<<s1<<endl;
Назначение строки не может быть выполнено путем назначения индексов без фиксирования или определения размера строки. Это может вызвать ошибку строкового индекса. Если вы хотите сделать это, я думаю, что конкатенация строк — лучший метод; то есть путем добавления подстрок или строковых индексов в строку. Ниже приведен код, который использует метод конкатенации строк.
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int main()
{
string s,s1="";
cin>>s;
s1= s1 + s[1];
s1= s1 + s[2];
s1= s1 + s[3];
cout<<s1<<endl;
return 0;
}