program story

printf를 사용하여 널이 아닌 문자열을 어떻게 인쇄합니까?

inputbox 2020. 12. 4. 08:10
반응형

printf를 사용하여 널이 아닌 문자열을 어떻게 인쇄합니까?


런타임에 문자열의 길이를 알고 있다고 가정하고 printf를 사용하여 null이 아닌 문자열을 인쇄하려면 어떻게해야합니까?


printf("%.*s", length, string);

다른 인수와 함께 사용 :

printf("integer=%d, string=%.*s, number=%f", integer, length, string, number);
//                         ^^^^                       ^^^^^^^^^^^^^^

C에서는 %.123s형식 과 함께 출력 할 최대 길이를 지정할 수 있습니다. 이는 출력 길이가 최대 123 자임을 의미합니다. 123에 의해 대체 될 수 *길이는 printf와의 인수 대신 하드 코딩에서 이동합니다 그래서.

이는에 string내부 널 바이트 (\ 0)를 포함하지 않는다고 가정합니다 %.123s. 최대 길이 만 제한 하고 정확한 길이가 아니라 문자열은 여전히 ​​널 종료로 처리됩니다.

null이 아닌 종료 문자열을 내부 null로 인쇄하려면 단일 printf를 사용할 수 없습니다. 사용 fwrite하는 대신 :

fwrite(string, 1, length, stdout);

자세한 설명은 @MSDousti의 답변참조하십시오 .


@KennyTM가 제공하는 대답은 훌륭하지만 미묘합니다.

일반적으로 문자열이 널이 아닌 "종료"이지만 중간에 널 문자가 printf("%.*s", length, string);있으면 예상대로 작동하지 않습니다. 때문이다 %.*s형식 문자열 묻는 printf인쇄 할 최대length문자가 아니라 정확히 length 문자.

차라리 OP 아래의 주석에서 @William Pursell이 지적한보다 일반적인 솔루션을 사용하고 싶습니다.

fwrite(string, sizeof(char), length, stdout);

다음은 샘플 코드입니다.

#include <stdio.h>

int main(void) {
    size_t length = 5;

    char string[length];
    string[0] = 'A';
    string[1] = 'B';
    string[2] = 0;        // null character in the middle
    string[3] = 'C';
    string[4] = 'D';

    printf("With printf: %.*s\n", length, string);
    printf("With fwrite: ");
    fwrite(string, sizeof(char), length, stdout);
    printf("\n");

    return 0;
}

산출:

With printf: AB
With fwrite: AB CD

참고 URL : https://stackoverflow.com/questions/2137779/how-do-i-print-a-non-null-terminated-string-using-printf

반응형