문제

배열에 포함 된 값을 간단히 인쇄하려고합니다.

'결과'라는 문자열이 있습니다. 자동으로 생성 되었기 때문에 얼마나 큰지 정확히 모르겠습니다.

내가 읽은 내용에서 다음을 수행하여 배열의 크기를 결정할 수 있습니다.

sizeof(result)/sizeof(result[0])

이 올바른지? 내 프로그램의 경우 sizeof (result) = 16 및 sizeof (result [0]) = 16이므로 코드가 내 배열이 크기 1임을 알려줍니다.

그러나 이는 다음과 같은 배열 값을 수동으로 인쇄하기 때문에 올바르게 보이지 않습니다.

std::cout << result[0] << "\n";
std::cout << result[1] << "\n";
std::cout << result[2] << "\n";
std::cout << result[3] << "\n";
etc...

... 그런 다음 내가 찾고있는 결과 값을 봅니다. 배열은 길이/크기가 100+ 이상입니다.

배열의 크기/길이를 결정하는 것은 매우 간단한 것 같습니다.

나는 약간의 C ++ 신생아이므로 모든 도움이 감사하겠습니다.

도움이 되었습니까?

해결책

C ++에서 배열의 크기를 동적으로 결정할 수 없습니다. 매개 변수로 크기를 전달해야합니다.

참고로 표준 라이브러리 컨테이너 (예 : 벡터)를 사용하면이를 모두 사용합니다.

당신의 sizeof 예시, sizeof(result) 포인터의 크기를 요구하고 있습니다 (아마도 std :: string). 함수로 전달 될 때 실제 배열 유형 "감소"는 (함수가 배열 유형을 가져 오라고 선언하더라도) 포인터 간 요소 유형으로 감소하기 때문입니다. 그만큼 sizeof(result[0]) 배열에서 첫 번째 요소의 크기를 반환합니다.이 요소는 우연히 16 바이트입니다. 포인터는 플랫폼에서 16 바이트 (128 비트) 인 것 같습니다.

기억 sizeof ~이다 언제나 C ++에서 컴파일 타임에 평가, 런타임에 절대 평가.

다른 팁

측면에 따르면, 배열의 크기를 확인하는 더 나은 방법 (배열이 범위에 있고 포인터로 부패하지 않는 경우) :

// simple: runtime result
template <typename T, std::size_t N>
inline std::size_t sizeof_array( T (&)[N] ) {
   return N;
}

// complex: compile time constant
template <typename T, std::size_t N>
char (&static_sizeof_array( T(&)[N] ))[N];   // declared, not defined
#defined SIZEOF_ARRAY( x ) sizeof(static_sizeof_array(x))

두 경우 모두 컴파일러는 포인터 (동적 배열 또는 붕괴 배열)로 전달하려고하면 다음을 감지합니다.

void f( int array[] ) { // really: void f( int *array )
{
//   sizeof_array(array);              // compile time error
//   int another[SIZEOF_ARRAY(array)]; // compile time error
}
int main() {
   int array[] = { 1, 2, 3 };
   std::cout << sizeof_array(array) << std::endl; // prints 3
   int another_array[ SIZEOF_ARRAY(array) ];
   std::cout << sizeof_array(another_array) << std::endl; // 3 again
}

당신이 가진 것이 "실제"배열이라면 (x)/sizeof (x [0]) 트릭이 작동합니다. 그러나 당신이 가진 것이 실제로 바늘 (예 : 함수에서 반환 된 무언가) 그러면 그 트릭은 작동하지 않습니다. 결국 포인터의 크기를 포인터 크기로 나눕니다. 그들 ~이다 다른 유형에 대한 포인터이지만 일반적인 시스템에서는 모든 포인터가 동일한 크기이므로 하나를 얻을 수 있습니다. 포인터가 크기가 다르더라도 결과는 여전히 많은 문자열과 관련이 없습니다.

더 나은 사용 std::vector<std::string> 원시 어레이 대신. 그런 다음 배열 메모리를 수동으로 관리 할 필요가 없으며 사용할 수 있습니다. size() 방법 요소 수를 알고 싶다면.

동적으로 할당 된 원시 어레이를 사용하는 경우 크기를 직접 추적해야합니다. 배열에서 크기를 얻을 수 없습니다. 추가 변수로 저장하는 것이 가장 좋습니다.

크기 (Array)/sizeof (요소)는 고정 길이 건 어레이 (포인터가 아님)의 고정 길이 배열에 대해 작동합니다. 문자열 배열로서 우리는 가장 자주 (고정 길이) 배열의 포인터-various- (고정) 길이 스트링을 사용 하므로이 트릭은 작동하지 않습니다. 크기는 컴파일 시간에 알려진 크기가 알려진 물체에 사용됩니다. 동적으로 할당 된 데이터 자체에는 적용 할 수 없습니다.

객체에 문자열 배열의 경우와 같은 포인터가 포함 된 경우 () 크기는 가장 높은 수준 (고정 크기) 구조의 크기를 반환합니다. 종종 그것은 단일 포인터의 크기 일뿐입니다. 포인터가 가리키는 할당 된 데이터의 크기는 포함되지 않습니다. 그 데이터는 실제로 주 객체의 일부가 아니기 때문에 실제로 하나 이상의 별도의 객체입니다 (우리는 구성 대신 집계가 있습니다. http://en.wikipedia.org/wiki/object_composition).

C ++에서 벡터를 사용하는 것은 요구에 매우 편리합니다. 다른 적절한 표준 컨테이너도 사용할 수 있습니다. 길이 () 및 size () 메소드는 동의어입니다. http://www.cplusplus.com/reference/string/string/size/)

추신은 std :: 문자열의 객체 크기의 경우 s.length ()에 의해 반환 된 실제 (변수) 문자열 길이와 무관 한 일정합니다. 실제 할당 된 메모리 크기는 s.capacity ()에 의해 반환되며 길이 ()보다 클 수 있습니다.

벡터 배열 사용 예 :

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    string s = "01234";
    cout << "s[" << s.length() << "]=\"" << s << "\"" << endl; 
    cout << "sizeof(s)=" << sizeof(s) << " (implementation dependent)" << endl;
    cout << endl;

    s += "56789012345";
    cout << "s[" << s.length() << "]=\"" << s << "\"" << endl; 
    cout << "sizeof(s)=" << sizeof(s) << " (implementation dependent)" << endl;
    cout << endl;

    vector<string>vs={"12","23","345","456","567","67888","7899999999","8","9876543210"};

    cout << "vs[" << vs.size() << "]={";
    size_t sz=0;
    for (size_t index=0; index<vs.size(); index++)
    {
        sz+=vs[index].size();
        if (index>0)
            cout << ",";
        cout << "\"" << vs[index] << "\":" << vs[index].size();
    }
    cout << "}:" << sz << endl;
    cout << "sizeof(vs)=" << sizeof(vs) << " (implementation dependent)" << endl;

    return 0;
}

결과:

s[5]="01234"
sizeof(s)=8 (implementation dependent)

s[16]="0123456789012345"
sizeof(s)=8 (implementation dependent)

vs[9]={"12":2,"23":2,"345":3,"456":3,"567":3,"67888":5,"7899999999":10,"8":1,"9876543210":10}:39
sizeof(vs)=24 (implementation dependent)
template< class T, size_t N >
std::size_t Length(const T(&)[N])
{
    return N;
};

std::cout << Length(another_array) << std::endl;

문자열 벡터에서 size size () 메소드에서

알아야 할 사항 : 텍스트는 다른 방법으로 표시 될 수 있습니다. 다양한 텍스트 배열도 다른 방법으로 표시 될 수 있습니다.

C 스타일 스트링에 대한 포인터 배열

일반적인 방법은 다양한 포인터를 갖는 것입니다. char. 문제는 배열의 크기가 모든 텍스트의 크기를 나타내지 않는다는 것입니다. 또한 텍스트를 삭제해야 할 수도 있으므로 데이터 또는 포인터의 소유권도 설정해야합니다 (Callee가 텍스트를 삭제하거나 발신자를 수행 할 수 있습니까?). 배열이기 때문에 배열의 크기는 항상 모든 매개 변수의 배열과 함께해야합니다 (배열이없는 한 언제나 고정 된 크기).

의 배열 char - 포장 된 텍스트

또 다른 방법은 배열을 전달하는 것입니다 char 어레이에 문자열이 인접하게 유지하십시오. 하나의 문자열은 이전의 종단 숯을 따릅니다. 이 배열을 사용하면 모든 문자열의 총 크기가 표시되며 낭비되는 공간이 없습니다. 다시, 배열을 사용하면 배열의 크기가 통과 할 때 배열과 함께해야합니다.

의 배열 std::string

C ++에서 텍스트를 사용하여 표현할 수 있습니다 std::string. 이 경우 배열은 문자열의 양을 나타냅니다 (위의 C- 스트링 어레이와 유사). 모든 문자열의 총 크기를 얻으려면 각 개별 문자열의 크기를 요약해야합니다. 이것은 배열이므로 배열의 크기도 전달되어야합니다.

요약

런타임 배열 크기는 배열이 통과 될 때 배열과 함께해야합니다. sizeof 컴파일 시간에만 처리됩니다. 더 간단한 구조는입니다 std::vector, 크기와 메모리 할당을 동적으로 처리합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top