답변:
기본 방법은 다음과 같습니다.
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
종종 더 유용한 다른 방법은 다음과 같습니다.
printf ("Here are the first %d chars: %.*s\n", 8, 8, "A string that is more than 8 chars");
여기에서 printf ()에 대한 int 인수로 길이를 지정합니다. 이는 형식의 '*'를 인수에서 길이를 가져 오는 요청으로 처리합니다.
표기법을 사용할 수도 있습니다.
printf ("Here are the first 8 chars: %*.*s\n",
8, 8, "A string that is more than 8 chars");
이것은 또한 "% 8.8s"표기법과 유사하지만 런타임시 최소 및 최대 길이를 지정할 수 있습니다. 다음과 같은 시나리오에서보다 현실적으로 가능합니다.
printf("Data: %*.*s Other info: %d\n", minlen, maxlen, string, info);
의 POSIX 사양 printf()
은 이러한 메커니즘 을 정의합니다.
-
지정된 전체 길이로 만들기 위해 공백으로 채워집니다 (를 추가하지 않는 한 왼쪽에 있음 ).
고정 된 양의 문자를 지정하는 것 외에도 *
printf가 인수에서 문자 수를 가져옴을 의미하는을 사용할 수도 있습니다 .
#include <stdio.h>
int main(int argc, char *argv[])
{
const char hello[] = "Hello world";
printf("message: '%.3s'\n", hello);
printf("message: '%.*s'\n", 3, hello);
printf("message: '%.*s'\n", 5, hello);
return 0;
}
인쇄물:
message: 'Hel'
message: 'Hel'
message: 'Hello'
사용 printf
당신은 할 수 있습니다
printf("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
C ++를 사용하는 경우 STL을 사용하여 동일한 결과를 얻을 수 있습니다.
using namespace std; // for clarity
string s("A string that is more than 8 chars");
cout << "Here are the first 8 chars: ";
copy(s.begin(), s.begin() + 8, ostream_iterator<char>(cout));
cout << endl;
또는 덜 효율적입니다.
cout << "Here are the first 8 chars: " <<
string(s.begin(), s.begin() + 8) << endl;
ostream_iterator<char>(cout)
! 대신 ostreambuf_iterator<char>(cout)
! 성능 차이는 다소 커야합니다.
std::cout.write(s.data(), 8)
입니다. 또는 최신 C ++에서 std::cout << std::string_view{s.data(), 8}
.
C ++에서는 쉽습니다.
std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, ""));
편집 : 문자열 반복기와 함께 사용하는 것이 더 안전하므로 끝까지 실행하지 마십시오. 너무 짧은 printf와 문자열이 어떻게되는지 잘 모르겠지만 이것이 더 안전 할 수 있다고 생각합니다.
std::cout << someStr.substr(0,8);
훨씬 더 분명합니다.