source

C의 printf 형식 문자열에 %c와 %s가 모두 있는 이유는 무엇입니까?

goodcode 2022. 8. 24. 23:54
반응형

C의 printf 형식 문자열에 %c와 %s가 모두 있는 이유는 무엇입니까?

에 C의 printf가 모두 있는 입니까?%c ★★★★★★★★★★★★★★★★★」%s

는 그것을 있다.%c단일 문자를 나타냅니다.%s는 null로 종단된 문자열을 나타내지만 문자열 표현만으로 충분하지 않을까요?

%s0 (오류)'\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 char1번으로 하다

%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

반응형