Объявление строки фиксированного размера и последующий ввод - PullRequest
0 голосов
/ 09 мая 2020
#include<bits/stdc++.h>
using namespace std;
int main(){
    int length;
    cin>>length;
    string s(length,'\0');
    cin>>s;
    cout<<s;
}

int код, приведенный выше, сначала я беру длину int, а затем использую ее для определения размера строки, но проблема в том, что когда я cin>>s после определения длины, строка по-прежнему занимает больше символов, чем длина, т.е. ВЫХОД ->

3
Hello
Hello

этого не должно происходить после определения длины строки,

Ответы [ 3 ]

1 голос
/ 09 мая 2020

Может быть, вы хотите:

std::string s(length, '\0');
std::cin.get(s.data(), s.size());
0 голосов
/ 09 мая 2020

Краткий ответ: да, должно. Вы неверно истолковываете смысл инструкций, которые вы даете, без учета документации.

Длинный ответ: вы создали пустую строку с резервированием из 3 символов. operator>> присвоил новое значение s. Старое значение, 3-символьная строка потеряна.

0 голосов
/ 09 мая 2020

В документации написано:

istream& operator>> (istream& is, string& str);

Извлечь строку из потока

Извлечь строку из входного потока is, сохраняя последовательность в str, которая перезаписывается ( предыдущее значение str заменяется ). Каждый извлеченный символ добавляется к строке, как если бы был вызван его член push_back.

Итак, когда вы делаете:

cin>>s;

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

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