printf를 사용하여 문자를 반복하는 방법은 무엇입니까?


79

printf("?", count, char)캐릭터 count시간 을 반복하는 것과 같은 것을하고 싶습니다 .

이를 수행하기위한 올바른 형식 문자열은 무엇입니까?

편집 : 예, printf()루프에서 호출 할 수 있다는 것이 분명 하지만 피하고 싶었던 것입니다.


2
몇 명을 염두에 두셨습니까?
WhozCraig 2013

4
컴파일 타임에 카운트를 모르는 것은 루프 작성에 장애물이 아닙니다.
Keith Thompson

귀하의 질문은 합리적으로 명확하지만 (진짜 대답은 printf원하는 것을 수행하는 형식 이 없다는 것 입니다), 귀하의 의견은 귀하가 무엇을 요구하는지 확실하지 않게 만듭니다. 함수에 전달되는 형식 문자열과 인수에 대해 이야기합니다. 어떤 기능에 대해 질문하고 있습니까? 당신이 우리에게 말하지 않는 것이있는 것 같습니다.
Keith Thompson

@KeithThompson 나는 'printf'주위에 래퍼를 썼기 때문에 그 주장은 원래의 것과 같았고 혼란에 대해 죄송합니다. 이게 더 필요한 이유를 설명 했어야했는데 말이 맞아요.
Muis

나는 아직도 당신이 무엇을하려고하는지, 또는 (@synthesizerpatel에 대한 공격이 아님) 왜 당신이 한 대답을 받아들 였는지 분명하지 않은 것 같습니다. 이것은 심각한 해결책이 아닙니다.
Keith Thompson

답변:


63

짧은 답변-예, 긴 답변 : 원하는 방식이 아닙니다.

가변 너비를 허용하는 printf 의 % * 형식을 사용할 수 있습니다 . 그리고 인쇄 할 값으로 '0'을 사용 하면 왼쪽이 0으로 채워진 오른쪽 정렬 텍스트와 결합 됩니다.

생성 :

내 혀가 내 뺨에 단단히 고정 된 상태에서이 작은 공포 쇼 코드를 제공합니다.

때때로 당신 은 왜 당신이 나머지 시간 동안 그렇게 열심히 노력하는지 기억하기 위해 나쁜 일을해야 합니다.


3
나는 내가 생각했던 것을 명확하게 기억하지 못하지만 귀하의 코드에서 상한은 4096. 나는 당신이 malloc버퍼를 할 수 있다고 생각합니다 .
Keith Thompson

2
그럴 수 있지. 칼싸움 == 회피!
synthesizerpatel

4
이 스타일은 루프에서 문자를 직접 할당하는 것보다 엉망입니다.
liuyang1 2015

2
네. 이 방법은 끔찍하지만 OP 질문에 답합니다.
synthesizerpatel

2
공포 쇼가 의미하는 바를 명확히 해주시겠습니까? 경고를하려는 것 같지만 무엇인지 잘 모르겠습니다. "% *"를 사용할 때 오버플로의 위험을 지적하려고하십니까?
cheshirekow

117

다음 기술을 사용할 수 있습니다.

이것은 "=====" Visual Studio에서 나를 위해 작동하며 모든 C 컴파일러에서 작동하지 않아야 할 이유가 없습니다.


3
이 답변이 정확할뿐만 아니라 크로스 플랫폼에서 작동한다는 점을 고려할 때이 답변이 더 높은 평가를받지 않은 것은 유감입니다. OSX, Linux 및 OpenBSD에서 C 및 Perl (C printf anywho를 래핑)에서 테스트했습니다.
synthesizerpatel

3
감사합니다. 10 년 전에이 일을했던 것을 기억했지만 잊고 다시 발견했습니다.
rep_movsd 2013 년

19
그것은 정확히 유연하지 않습니다. 너비가 문자열 자체보다 크면 문자열보다 더 많이 인쇄되지 않습니다 (적어도 gcc를 사용한 간단한 실험에서는 제외).
Mats Petersson 2013 년

1
이것은 synthesizerpatel의 답변보다 잘 작동합니다. 0 대신 공백을 시도하고 너비가 0이면 여전히 단일 공백이 인쇄됩니다. 이것은 그렇지 않습니다.
검은 색

1
좋은 캐치! @rep_movsd
Juan Diego Godoy Robles

24

0 또는 공백을 반복하도록 제한하는 경우 다음을 수행 할 수 있습니다.

공백의 경우 :

0의 경우 :


17

C ++에서는 std :: string을 사용하여 반복되는 문자를 얻을 수 있습니다.

예를 들면 :

산출:


18
질문은 C ++가 아니라 C에 관한 것이 었습니다.
Keith Thompson

9
엄격하게 C는 아니지만 이것은 나를 도왔습니다. 감사합니다
자동화


12

그와 같은 일은 없다. 또는를 사용하여 루프를 작성 printf하거나 puts문자열 카운트 횟수를 새 문자열로 복사하는 함수를 작성해야합니다.


2
내가 가장 복잡한 표현을 할 수 있다는 것이 매우 이상하지만, 문자를 반복하는 것과 같은 단순한 것은 지원되지 않습니다.
Muis

왜? 반복하려는 항목 주위에 루프를 추가하기 만하면됩니다. printf가하는 일의 대부분은 자신의 코드에서 [매우 쉽게] 할 수없는 일입니다. 라이브러리가 어려운 부분을하고 응용 프로그램이 쉬운 부분을 처리하도록하세요. 이것이 여기의 주제라고 생각합니다.
Mats Petersson

5
그리고 그것에 대해 강하게 느낀다면 C 표준위원회가 개선을위한 제안에 관심이 있고 glibc 내부의 샘플 구현이 표준이 될 가능성을 높일 수있을 것 같습니다. 구현하면 다른 사람이 좋은 생각이라고 생각할 것입니다. printf가 처음 소개 된 이후로 지난 50 년 동안 만 누락되었으므로 아마도 감독 일뿐입니다 ...;)
Mats Petersson 2013

@MatsPetersson 사전에 형식 문자열을 모르기 때문에 해결책이 없습니다. Mokammel에 대한 내 응답을 참조하십시오.
Muis

3
이 질문이 왜 반대 되는가-이 답변에 반대하는 경우 불만 사항이 무엇인지 알려주세요 ...
Mats Petersson

6

printf그렇게하지 않습니다 printf. 단일 문자를 인쇄하기에는 과잉입니다.

이것이 비효율적이라고 걱정하지 마십시오. putchar()출력을 버퍼링하므로 필요한 경우가 아니면 각 문자에 대해 물리적 출력 작업을 수행하지 않습니다.


내 함수에 전달할 형식 문자열이나 인수를 알지 못합니다. xml 파일에서 읽거나 사용자 입력이 될 수 있습니다.
Muis 2013

당신은 그것을 인쇄하는 데 필요한 문자와 횟수가 있습니다. 더 많은 정보가 필요하십니까? 로 단일 문자를 인쇄하려면 printf형식 문자열은 "%c"입니다. 그러나 사용할 필요가 없으며이 printf경우 형식 문자열이 전혀 필요하지 않습니다. (단순히 더 없다 printf문자를 여러 번 인쇄 할 형식 문자열은 있지만, 작업을 수행하기 위해 다른 더 좋은 방법이 있습니다.)
키이스 톰슨

내가 말했듯이 내 함수에 대한 인수가 무엇을 나타내는 지 모르겠습니다. XML 파일에서 형식 문자열과 인수를 읽고이를 printf ()에 전달한다고 가정하면 내 함수가 루프가 필요하고 두 번째 인수가 개수를 나타내는 것을 어떻게 인식 할 수 있습니까? 이것이 내 입력이 컴파일 타임에 알려지지 않았다는 의미입니다.
Muis

4
@Joshua : 어떤 기능에 대한 주장 ? 귀하의 질문에는 기능에 대한 언급조차 없습니다.
Keith Thompson

1
@Joshua 당신은 컴파일 시간과 함수의 과도한 사용으로 인해 분명하게 혼란스러워합니다. 당신이 그것을 보이게 만드는 것만 큼 어렵지 않습니다. 문자 'x'를 n 번 인쇄하는 함수가 필요합니다. xml에서 가져온 경우 xml을 구문 분석하고 인쇄 할 문자와 인쇄가 필요한 횟수를 찾습니다. strlen을 사용하여 xml 문자열 필드가 문자 'x'를 인쇄해야하는 횟수를 결정하는 위치에서 문자열 길이를 가져옵니다.
SayeedHussain

6

alloca () 함수를 지원하는 컴파일러가 있다면 이것이 가능한 해결책입니다.

기본적으로 '\ 0'으로 채워진 스택에 10 바이트를 할당하고 처음 9 바이트는 'x'로 채워집니다.

C99 컴파일러가있는 경우 다음은 더 깔끔한 솔루션 일 수 있습니다.


4
내가 제안 putchar('x')대신 printf("%c", 'x').
Paddu

왜? 실행 시간이 더 짧습니까?
71GA

4

2

이 작업을 수행하는 기능을 만들고 사용할 수 있습니다.

이것은 출력됩니다


2
putchar ()는 repeat () 루프에 더 적합합니다
rsaxvc

사실, 그러나 나는 모든 엔트리 레벨 코더가 이해할 수 있도록 내 코드를 매우 기본적으로 만들려고 노력했다
Loay Hussein 17

사용하는 것이 좋습니다 i < count. 그렇지 않으면 count에 대한 음수 입력으로 인해 원하지 않는 인쇄가 많이 발생할 수 있습니다.
ワイきんぐ

1

n<= sizeof(buffer)[어쩌면 n <2 ^ 16]

그러나 옵티마이 저는이를로 변경할 수 puts(buffer)있으며 EoS 부족은 .....

그리고 가정은 memset이 어셈블러 명령어라는 것입니다 (그러나 여전히 루프는 칩에 있습니다).

전제 조건 '루프 없음'이 주어지면 솔루션이 없다는 것을 엄격히 알 수 있습니다.


0

-2

이런 식으로하는 것 같아요.

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