printf ()를 사용하여 인쇄 할 문자열의 문자 수를 지정하는 방법이 있습니까?


127

인쇄 할 문자열의 문자 수를 지정하는 방법이 int있습니까 (s의 소수점 이하 자릿수와 유사 )?

printf ("Here are the first 8 chars: %s\n", "A string that is more than 8 chars");

인쇄 하시겠습니까 : Here are the first 8 chars: A string

답변:


226

기본 방법은 다음과 같습니다.

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()은 이러한 메커니즘 을 정의합니다.


2
마지막 예 : 복사 된 문자열이 minlen보다 짧으면 어떨까요?
truthseeker

4
출력은 -지정된 전체 길이로 만들기 위해 공백으로 채워집니다 (를 추가하지 않는 한 왼쪽에 있음 ).
Jonathan Leffler

13
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

% 8s는 최소 8 자 너비를 지정합니다. 8에서 자르고 싶으므로 % .8s를 사용하십시오.

항상 정확히 8자를 인쇄하려면 % 8.8s를 사용할 수 있습니다.


13

고정 된 양의 문자를 지정하는 것 외에도 *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'

11

사용 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;

1
참고 : 사용 하지 마십시오 ostream_iterator<char>(cout)! 대신 ostreambuf_iterator<char>(cout)! 성능 차이는 다소 커야합니다.
Dietmar Kühl

대신 사용하는 것이 더 효율적 std::cout.write(s.data(), 8)입니다. 또는 최신 C ++에서 std::cout << std::string_view{s.data(), 8}.
Artyer

4

처음 4 자 인쇄 :

printf("%.4s\n", "A string that is more than 8 chars");

자세한 내용은 이 링크 를 참조하십시오 (.precision -section 확인).


4

C ++에서는 쉽습니다.

std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, ""));

편집 : 문자열 반복기와 함께 사용하는 것이 더 안전하므로 끝까지 실행하지 마십시오. 너무 짧은 printf와 문자열이 어떻게되는지 잘 모르겠지만 이것이 더 안전 할 수 있다고 생각합니다.


32
하, 그래 "쉬운". C ++는 항상 자동차 사고처럼 보입니다.
James K. Polk 회장

당신은 여전히 ​​c ++에서 printf ()를 할 수 있습니다 :)
StasM

6
풍자라고 생각합니다. std::cout << someStr.substr(0,8);훨씬 더 분명합니다.
MSalters

2
@MSalters 답변으로 게시해야합니다.
Jonathan Mee


1

C ++에서는 다음과 같이합니다.

char *buffer = "My house is nice";
string showMsgStr(buffer, buffer + 5);
std::cout << showMsgStr << std::endl;

두 번째 인수를 전달할 때 문자열 크기를 넘어서 메모리 액세스 위반을 생성 할 수 있기 때문에 이것은 안전하지 않습니다. 이를 방지하기 위해 자체 검사를 구현해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.