2014-09-14 3 views
4

사용자로부터 입력을 std::array으로 가져 오는 방법은 무엇입니까?cin에서 C++ 11 std :: array로 사용자 입력을 얻는 방법

이것은 가지고있는 내용이지만 컴파일되지는 않습니다.

std::array<char, 10> myArray{"hello"} ; 
std::cout << "Enter your name: "; 
std::cin >> myArray; 

10 자 이상을 입력하면 잘 렸습니다. 나중에 다른 입력을 허용하도록 화면 버퍼를 지워야합니다.

+0

10 자 이상 입력하면 어떻게 될까요? –

+0

은 잘라내어 무시하십시오. 나중에 다른 입력을 허용하도록 화면 버퍼를 지워야합니다. – dmaelect

답변

1

그냥 작업에 적절한 도구를 사용

std::string name; 
std::cout << "Enter your name: "; 
std::getline(std::cin, name); 

Live demo

+1

** Jeffrey ** 이것이 특정 목적에 맞음에도 불구하고, OP는 이것을 요구하지 않습니다. – nbro

+1

@cell 나는 문자열 입력을받는 방법을 묻고 있다고 생각한다. 이 가정은 입력이 요청되기 전에 표준 출력에 쓰여진 레이블 "사용자 이름 입력 :"에 대한 것입니다. 또한 그는 적절한 성능을 위해'char []'을 사용하여 어딘가에 읽어야한다고 가정하고 아마도'std :: array'에 대한 것을 읽고 함께 놓을 것입니다. 그것은 끔찍한 일입니다. – Shoe

+0

@cell 만약 내가 틀렸다면, 고정 된 크기의 배열로 무엇을하려고하는지에 대한 의미를 듣고 싶다. 짧은 문자열에도 null 문자를 저장해야하는 것과 같은 작은 것들 배열이나 뭐가 넘쳐나는지 등에 대해 ... – Shoe

4

을 현재의 예를 들어 당신이 std::string 대신 std::array<char, 10> 사용해야합니다. 당신은 여전히 ​​배열을 읽으려면 다음과 같이 그러나, 당신은 그것을 할 수 :

#include <iostream> 
#include <array> 

int main() { 
    std::array<int, 10> arr; 
    for(int temp, i = 0; i < arr.size() && std::cin >> temp; ++i) { 
     arr[i] = temp; 
    } 

    for(auto&& i : arr) { 
     std::cout << i << ' '; 
    } 
} 

출력은 : 기본적인 아이디어는 단지 배열 크기까지 루프를 통해 다음에 삽입

$ ./a.out 
10 11 12 13 14 15 16 17 18 19 
10 11 12 13 14 15 16 17 18 19 

입니다

배열은 operator[]을 사용합니다. 삽입 프로세스에서 오류를 catch하려면 루프 조건에 std::cin >> temp을 유지하십시오. 이 작업을 수행하는 표준 라이브러리에는 내장 함수가 없습니다. 자주 이렇게 자신을 발견 할 경우

, 당신은 당신의 자신의 함수로 이동할 수 : 그 정의되지 않은 동작 이후

#include <iostream> 
#include <array> 

template<typename T, size_t N> 
std::istream& input_array(std::istream& in, std::array<T, N>& arr) { 
    unsigned i = 0u; 
    for(T temp; i < arr.size() && in >> temp; ++i) { 
     arr[i] = std::move(temp); 
    } 
    return in; 
} 

int main() { 
    std::array<int, 10> arr; 
    input_array(std::cin, arr); 
} 

당신은 std 네임 스페이스 내에서 것들에 대한 operator>>에 과부하가 걸리지한다.

당신은 다음과 같이 기능을 수정할 수 있습니다 임시을 피하려면 :

template<typename T, size_t N> 
std::istream& input_array(std::istream& in, std::array<T, N>& arr) { 
    for(unsigned i = 0u; i < arr.size() && in >> arr[i]; ++i) { 
     // empty body 
    } 
    return in; 
} 
+0

그냥 나를 괴롭 히 : 도우미 함수는'임시'에서'arr [i]'로 불필요한 복사를합니다. –

+0

@GabrielGarcia 피할 수없는 일입니다. 당신은'std :: move'를 사용하여 이동을 요청할 수 있지만, 결국에는 복사 또는 이동을해야합니다. – Rapptz

+0

아마도 이가? 'while (i > arr [i ++]; ' –

0

당신은 버퍼에 전체 라인을 얻고, 그 버퍼의 최초의 10 바이트 (또는 전체를 추출 할 수 있습니다 버퍼가 10보다 작은 경우)를 배열에 추가합니다. 이것은 또한 주위에 어떤 쓰레기도 남기지 않는 문제를 해결합니다. std::cin.

std::array<char, 10> myArray{"hello"} ; 

std::string s; 
std::getline(std::cin, s); 
if (!std::cin) 
    throw..... // input was closed before a line was entered 

std::size_t len = std::min(myArray.size(), s.size()); 
std::copy(s.begin(), s.begin() + len, myArray.begin()); 

myArray에 널 종료 문자열이 생성되지 않습니다. 그렇게하고 싶다면 추가 문자 하나를 복사하십시오 (len은 많아야 myArray.size() - 1이됩니다).

<array>, <iostream>, <algorithm>

+0

정말 멋지다. 나는 그것을 좋아한다. – dmaelect

1

<iostream><limits> 헤더를 필요 포함하도록 요구할 수있다.

std::cin.get(myArray.data(), myArray.size()); 
// get() will actually read up to myArray.size() - 1 chars 
// and add a null character at the end ('\0') 

if (std::cin.fail()) { 
    // could not read any characters or EOF occurred 
} else { 
    // drop rest of line that was read to buffer 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

    // number of characters read: std::cin.gcount() 

    // ... use myArray ... 
} 

방법 참조 :

http://en.cppreference.com/w/cpp/io/basic_istream/get

http://en.cppreference.com/w/cpp/io/basic_ios/fail

http://en.cppreference.com/w/cpp/io/basic_istream/ignore

http://en.cppreference.com/w/cpp/io/basic_istream/gcount

0

std::cin가 기대입니다 char 포인터 (char*)를 입력하십시오. 따라서 .data()을 사용해야합니다.

std::array<char, 50> arr{"Hello, "}; 
size_t hello_length = strlen(arr.data()); 

std::cout << "Enter your name: "; 
std::cin >> std::setw(10) >> (arr.data() + hello_length); 

std::cout << arr.data() << std::endl; 
+0

너무 많은 문자를 입력하면 오버플로가되지 않습니까? – MatthiasB

+0

@MatthiasB,'std :: setw' 도움말을 추가하지 않으시겠습니까? – user2032915

+0

네, 그렇습니다. – MatthiasB

0

배열의 포인터는 첫 번째 요소의 주소입니다.
std::array의 경우 배열의 포인터로 입력 할 수 있습니다.

std::cin >> myArray.begin(); 
관련 문제