2011-01-23 6 views
8

나는 이것이 정말 어리석은 질문 인 것처럼 느낀다. 그러나 나는 어디에서나 대답을 찾을 수 없다.문자 배열 일부 가져 오기

문자 배열에서 문자 그룹을 가져올 수 있습니까? 일부 의사 코드를 아래로 던져 :

char arry[20] = "hello world!"; 
char part[10] = arry[0-4]; 
printf(part); 

출력 :

그래서
hello 

, 나는 반복하고는 숯불에 의해-문자 얻거나 변환하지 않고이 같은 배열에서 문자의 세그먼트를 얻을 수 있습니다 substr()을 사용할 수 있도록 문자열에?

답변

15

간단히 말해서, 아니오. C 스타일의 "문자열"은 단순히 그렇게 작동하지 않습니다. 수동 루프 또는 strncpy()을 사용하거나 C++ std::string 기능을 통해 수행해야합니다. C++을 사용한다면 C++ 문자열로 모든 것을 할 수 있습니다!

사이드 노트

공교롭게도, 특정 어플리케이션 예를 들어, 당신은 단순히 printf()에서 제공하는 기능을 통해이를 달성 할 수

printf("%.5s\n", arry); 
+0

그래, 나쁘지. 아, 글자로 변환 할 수 있습니다. 더 우아한 솔루션이 있는지 궁금합니다. 그리고 나중에 사용하기 위해 char 배열의 일부를 트리밍하고 있으므로 printf의 기능을 사용하면 문제가 해결되지 않습니다. 어쨌든 그 재미있는 음식에 감사 드리며, 나는 그것에 대해 알지 못했습니다. – Curlystraw

+0

@Curlystraw : @ Moo-Juice의 대답은 C++ 문자열을 사용하며, 저에게 묻는다면 꽤 괜찮습니다! –

14

당신은 memcpy (또는 strncpy)를 사용할 수 있습니다 하위 문자열을 가져 오는 방법 :

memcpy(part, arry + 5 /* Offset */, 3 /* Length */); 
part[3] = 0; /* Add terminator */ 

코드의 측면에서 str에 신뢰할 수없는 입력이 있으면 printf(str)을 수행하면 형식 문자열 취약점이 발생할 수 있습니다.

+0

'printf'취약점 +1. –

4

Oli가 말한 것처럼 C++ std::string 기능을 사용해야합니다. 귀하의 예 :

std::string hello("Hello World!"); 
std::string part(hello.substr(0, 5)); // note it's <start>, <length>, so not '0-4' 

std::cout << part; 
+6

'std :: string part (hello, 0, 5); ...이 될 수 있습니다. –

0

글쎄, 당신은 두 가지 명백한 접근법을 언급합니다. 내가 생각할 수있는 유일한 것은 문자 배열을 처리하기 위해 자신의 하위 문자열 유형을 정의하는 것입니다.

struct SubArray 
{ 
    SubArray(const char* a, unsigned s, unsigned e) 
     :arrayOwnedElseWhere_(a), 
     start_(s), 
     end_(e) 
    {} 
    const char* arrayOwnedElseWhere_; 
    unsigned start_; 
    unsigned end_; 
    void print() 
    { 
     printf_s("%.*s\n", end_ - start_ + 1, arrayOwnedElseWhere_ + start_); 
    } 
};