null
종료 되지 않은 문자열이 있고 정확한 크기를 알고 있다고 가정합니다 . 그러면 printf
C에서 해당 문자열을 어떻게 인쇄 할 수 있습니까? 그런 방법이 떠오르지 만 지금은 알 수 없습니다 ...
null
종료 되지 않은 문자열이 있고 정확한 크기를 알고 있다고 가정합니다 . 그러면 printf
C에서 해당 문자열을 어떻게 인쇄 할 수 있습니까? 그런 방법이 떠오르지 만 지금은 알 수 없습니다 ...
답변:
printf에는 가능성이 있으며 다음과 같습니다.
printf("%.*s", stringLength, pointerToString);
아무것도 복사 할 필요가 없으며 원래 문자열이나 버퍼를 수정할 필요가 없습니다.
printf
도 ~ 십년 후 ... :)
printf
에는 최대 11 자 또는 NULL이 나올 때까지 인쇄합니다 . 귀하의 예에서 NULL이 먼저옵니다. 최대 길이를 지정해도 NULL이에 대한 "문자열 끝"의미를 잃지 않습니다 printf
.
다음은 %.*s
작동 방식과 지정 위치에 대한 설명입니다 .
printf 템플릿 문자열의 변환 사양은 일반적인 형식입니다.
% [ param-no $] flags width [ . precision ] type conversion
또는
% [ param-no $] flags width . * [ param-no $] type conversion
두 번째 형식은 인수 목록에서 정밀도를 가져 오는 것입니다.
'*'의 정밀도를 지정할 수도 있습니다. 이는 인수 목록의 다음 인수 (인쇄 할 실제 값 앞)가 정밀도로 사용됨을 의미합니다. 값은 int 여야하며 음수이면 무시됩니다.
— glibc 매뉴얼의 출력 변환 구문
들어 %s
문자열 형식, 정밀도는 특별한 의미가 있습니다 :
쓸 최대 문자 수를 나타 내기 위해 정밀도를 지정할 수 있습니다. 그렇지 않으면 종료 널 문자를 포함하지 않는 문자열의 문자가 출력 스트림에 기록됩니다.
— 기타 출력 변환 glibc 매뉴얼의
기타 유용한 변형 :
"%*.*s", maxlen, maxlen, val
오른쪽 정렬하고 앞에 공백을 삽입합니다."%-*.*s", maxlen, maxlen, val
왼쪽 정렬됩니다."%-*.*s", padding, str_view.size(), str_view.data()
printf("%.*s", length, string)
작동 안 할 것이다.
이것은 최대 길이 바이트 또는 널 바이트 중 먼저 오는 것을 인쇄하는 것을 의미합니다. null로 끝나지 않는 char 배열에 길이 전에 null 바이트가 포함되어 있으면 printf는 해당 바이트에서 중지되고 계속되지 않습니다.
#include<string.h>
int main()
{
/*suppose a string str which is not null terminated and n is its length*/
int i;
for(i=0;i<n;i++)
{
printf("%c",str[i]);
}
return 0;
}
코드를 편집했습니다. 다른 방법은 다음과 같습니다.
#include<stdio.h>
int main()
{
printf ("%.5s","fahaduddin");/*if 5 is the number of bytes to be printed and fahaduddin is the string.*/
return 0;
}
C
컨텍스트, 모든 문자열이 null이 종료됩니다. null이없는 char 배열은 문자열이 아닙니다 ... char 배열입니다. :)