C의 printf 형식 문자열에 %c와 %s가 모두 있는 이유는 무엇입니까?
에 C의 printf가 모두 있는 입니까?%c
★★★★★★★★★★★★★★★★★」%s
는 그것을 있다.%c
단일 문자를 나타냅니다.%s
는 null로 종단된 문자열을 나타내지만 문자열 표현만으로 충분하지 않을까요?
%s
를 0
(오류)'\0'
것 , , , , , , , ).
★★★★★★★만 있으면char x;
인쇄하다.printf("%s", &x);
- 주소를 제공해야 합니다. 왜냐하면 예상외의 결과가 나타나기 때문입니다.&x + 1
도 있다0
.
따라서 null-terminated(매우 비효율적)가 아닌 한 한 문자를 인쇄할 수 없습니다.
EDIT: 다른 사람이 지적한 바와 같이, 2개의 파라미터는 각각 다른 것을 상정하고 있습니다.하나는 포인터, 다른 하나는 단일 문자입니다.하지만 그 차이는 어느 정도 명확하다.
NULL은 NULL로 설정되어 있습니다.만약 그들이%s
늘
char c = 'a';
의 경우, 「」는,c
종료해야 합니다. :) ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.
%s
는 늘(변수를 포인터로 지정)을 찾을 때까지 모든 문자를 인쇄하라고 말합니다.
%c
를 문자).'1 글글 ( ( one라라라 says 。
「」를 사용합니다.%s
하지 않는 그해, Null을 찾을 합니다.
다른 방법으로 설명하기 위해 다른 답을 훔치는 거죠
하는 경우%s
다음 명령을 사용하여 문자 주소를 올바르게 전달하고 null을 찾을 때까지 화면에 가비지가 표시되지 않도록 할 수 있습니다.
char c = 'c';
printf('%.1s', &c);
한 글자를 무효로 해야 한다고 다른 사람들이 언급한 문제는 진짜 문제가 아닙니다.는 '하게'라는 할 수 .%.1s
효과가 있을 거야
볼 때 더 은 '우리'의 입니다.%s
어떤 형태로든 하나 또는 여러 글자에 대한 포인터를 제공해야 합니다., rvalues 등출력하거나 변수를 수 .
편집: 이 답변에 대한 반응에 정말 화가 났기 때문에 이 답변은 삭제해야 할 것 같습니다.정말 그럴 가치가 없습니다.사람들은 질문을 읽어보지도 않고, 질문의 전문성을 어떻게 평가하는지도 모르는 채 이에 대해 반응하는 것 같다.
나는 가 더 좋아해야 않는다%.1s
에 걸쳐서%c
는 단지 그 뿐이다.%c
다른 대답이 말하는 척하는 것과 다른 것으로 대체될 수 없다.이 다른 답변들은 기술적으로 잘못된 것일 뿐이다.는 NULL의 문제가 .%s
.
printf 함수는 변수 함수이며 변수 수를 가집니다.인수는 함수(printf)가 호출되기 전에 스택에 푸시됩니다.printf 함수가 스택을 사용하기 위해서는 스택 내의 정보에 대해 알아야 하며 포맷 문자열이 사용됩니다.
예.
printf( "%c", ch ); tells the function the argument 'ch'
is to be interpreted as a character and sizeof(char)
반면에.
printf( "%s", s ); tells the function the argument 's' is a pointer
to a null terminated string sizeof(char*)
printf 함수 내부에서는 스택 내용을 결정할 수 없습니다. 예를 들어 'ch'와 's'를 구별하는 것은 실행 시 유형 확인이 없기 때문입니다.
.printf("%.1s", &c)
★★★★★★★★★★★★★★★★★」printf("%c", c)
했는데, 의 "Bash"는 "Bash"입니다time
유틸리티 실행 시간을 가져옵니다.
#include<stdio.h>
int main(){
char c = 'a';
int i;
for(i = 0; i < 40000000; i++){
//printf("%.1s", &c); get a result of 4.3s
//printf("%c", c); get a result of 0.67s
}
return 0;
}
결과, 「 」를 사용하고 있는 있습니다.%c
%.1s
따라서 %s는 %c의 작업을 수행할 수 있지만 %c는 여전히 성능에 필요합니다.
★★★의 %s
문자열의 값이 아닌 주소를 제공해야 합니다.
★★★의 %c
가 '우리'를 %s
%c
「 」, 「 」를 하려면 , 해야 .'\0'
그릭릭 들???
이 재미있는 질문에 다른 관점을 추가하고 싶습니다.
이것은 데이터 입력으로 귀결됩니다.여기서 본 답 중 하나는 문자 포인터를 제공할 수 있다는 것입니다.또 다른 하나는 문자 포인터를 제공할 수 있다는 것입니다.
"%.1s"
이것은 정말 사실일 수 있다.하지만 정답은 C 디자이너가 프로그래머에게 유연성을 제공하려고 노력하고 있다는 점과 어플리케이션 설치 공간을 줄이는 (비록 작지만) 방법에 있습니다.
때때로 프로그래머는 일련의 if-else 문 또는 스위치 케이스를 실행하고 싶을 수 있습니다.이 경우 상태에 따라 단순히 문자를 출력해야 합니다.이 경우 단일 문자가 32비트 또는 64비트(64비트 컴퓨터의 경우)인 포인터에 비해 8비트이기 때문에 문자를 하드코딩하면 실제로 메모리 내의 실제 공간이 줄어들 수 있습니다.포인터가 메모리 공간을 더 많이 차지합니다.
실제 문자를 사용하여 크기를 줄이고 싶다면 printf 유형의 연산자 내에서 이를 수행하는 방법은 두 가지가 있습니다.하나는 .1s를 키오프하는 것입니다만, 이 루틴은 문자 타입과 문자 포인터 또는 문자열 포인터(문자 배열)를 실제로 제공하고 있는 것을 어떻게 확실히 알 수 있을까요?이것이 그들이 %c를 사용한 이유입니다.그것은 다른 것이기 때문입니다.
재미있는 질문:-)
는 C'를 .%c
★★★★★★★★★★★★★★★★★」%s
형식 지정자는 서로 다른 유형을 처리하기 때문에 형식을 지정합니다.
A char
1번으로 하다
%c는 문자(정수값)를 예상하고 인코딩 규칙에 따라 인쇄합니다.
%s은(는) char 값을 포함하는 메모리 위치에 대한 포인터를 예상하고 0(소수) 문자를 찾을 때까지 인코딩 규칙에 따라 해당 위치에 있는 문자를 인쇄합니다.
이 두 사건은 겉모습은 비슷하지만 공통점은 별로 없습니다. 하나는 가치관을 가지고 다른 하나는 포인터를 가지고 작업하기 때문입니다.하나는 특정 정수값을 ASCII 문자로 해석하는 명령이며, 다른 하나는 메모리 위치 문자 내용을 문자별로 반복하여 0이 될 때까지 해석하는 명령입니다.
어느 누구도 참조에 대한 답변을 제공하지 않았기 때문에, 다음은 IBM의 형식 정의와 유사한 pubs.opengroup.com의 printf 사양입니다.
%c
int 인수는 부호 없는 문자로 변환해야 하며, 그 결과 바이트가 작성되어야 합니다.
%s
인수는 char 배열에 대한 포인터여야 합니다.어레이로부터의 바이트는 끝의 늘바이트까지(단, 포함하지 않음) 기입해야 합니다.정밀도가 지정되어 있는 경우는, 그 이하의 바이트를 기입한다.정밀도가 지정되어 있지 않거나 어레이 크기보다 클 경우, 애플리케이션은 어레이에 늘바이트가 포함되어 있는지 확인해야 한다.
언급URL : https://stackoverflow.com/questions/10846024/why-does-cs-printf-format-string-have-both-c-and-s
'source' 카테고리의 다른 글
vue-tables-2 서버 측에 범위 필터를 추가하는 방법 (0) | 2022.08.24 |
---|---|
Init pinia 상태 (0) | 2022.08.24 |
C++11은 C99로 지정된 이니셜라이저 목록을 지원하지 않는 이유는 무엇입니까? (0) | 2022.08.24 |
delete method vue의 모든 값 삭제 (0) | 2022.08.24 |
vue js html에서 시간에 따라 "닫힘" 또는 "열림"을 표시하려면 어떻게 해야 합니까? (0) | 2022.08.24 |