Я пытаюсь принять предложение как ввод от пользователя в приведенном ниже коде. например. Вход -

9

Сделай или умри

#include<iostream>
using namespace std;

int main(){
    int n;
    cout<<"Enter the length of the sentence: ";
    cin>>n;
    cin.ignore();
    char array[n+1]; 
    cin.getline(array,n);
    cin.ignore();
    cout<<array[7]<<endl;
    cout<<array[8]<<endl;

При печати массива [7] я получаю «i» в качестве вывода, но при печати массива [8] я ожидаю «e» в качестве вывода, но я ничего не получил в качестве вывода. Я объявил массив символов размером (n + 1), что означает, что массив [n] должен быть нулевым символом, но почему массив [8] получается нулевым символом?

Я где-то ошибаюсь?

0
user18035538 26 Янв 2022 в 10:55
2
«что означает, что массив [n] должен быть нулевым символом», почему? Где в вашем коде вы устанавливаете array[n] в null ?
 – 
463035818_is_not_a_number
26 Янв 2022 в 10:58
3
Кстати: создание вашего массива таким образом не является допустимым С++. Используйте размер, известный и постоянный во время компиляции, или используйте динамическое размещение или вектор. Некоторые компиляторы могут разрешить то, что вы делаете, но это недопустимый C++, а другие могут не скомпилировать его.
 – 
SKCoder
26 Янв 2022 в 11:07

2 ответа

Std::istream::getline(char* s, размер потока n):

  1. Извлекает символы из потока как неформатированные входные данные и сохраняет их в s как c-строку.
  2. n — максимальное количество символов, которые нужно записать в s, включая завершающий нулевой символ.

Если вы хотите прочитать свои 9 символов предложения, не только ваш буфер должен иметь длину 10 символов, но и n в getline должно быть равно 10.

https://www.cplusplus.com/reference/istream/istream/getline/

3
SKCoder 26 Янв 2022 в 11:17

Ответом на актуальную проблему занимается @SKCoder, поэтому я просто хочу добавить, что обработка ввода лучше работает с std::string, и я соответствующим образом изменил код:

#include <iostream>

int main(){
    size_t n;
    std::cout<<"Enter the length of the sentence: ";
    std::cin>>n;
    std::cin.ignore();
    std::string str;
    std::getline(std::cin, str);
    std::cin.ignore();
    std::cout<<str.substr(str.length()-2, 2)<<"\n";
    std::cout << (str.length() != n? "length is wrong": "length is correct") << "\n";
}

Обычно я не использую using namespace std;, чтобы избежать конфликтов пространств имен, но в этом случае это может иметь смысл. Используя строку, вам больше не нужна длина, поэтому вы можете использовать ее для проверки правильности ввода.

1
stefaanv 26 Янв 2022 в 11:59