문자열이 있는 문자열 및 문자(프린트f 포함)
의 사용법에 혼동했다.%c
그리고%s
다음 C 프로그램에서.
#include <stdio.h>
void main()
{
char name[]="siva";
printf("%s\n",name);
printf("%c\n",*name);
}
출력은
siva
s
%c 문자를 표시하기 위해 포인터를 사용해야 하는 이유, 문자열에는 포인터가 필요하지 않은 이유
사용할 때 오류가 발생하는 경우
printf("%c\n", name);
내가 받은 오류는
str.c: In function ‘main’:
str.c:9:2: warning: format ‘%c’ expects type ‘int’, but argument 2 has type ‘char *’
이 방법을 사용하는 경우:
#include<stdio.h>
void main()
{
char name[]="siva";
printf("name = %p\n", name);
printf("&name[0] = %p\n", &name[0]);
printf("name printed as %%s is %s\n",name);
printf("*name = %c\n",*name);
printf("name[0] = %c\n", name[0]);
}
출력:
name = 0xbff5391b
&name[0] = 0xbff5391b
name printed as %s is siva
*name = s
name[0] = s
그래서 '이름'은 실제로 메모리에 있는 문자 배열의 포인터 입니다.0xbff5391b로 처음 4바이트를 읽어보면 's', 'i', 'v', 'a'가 나타난다.
Location Data
========= ======
0xbff5391b 0x73 's' ---> name[0]
0xbff5391c 0x69 'i' ---> name[1]
0xbff5391d 0x76 'v' ---> name[2]
0xbff5391e 0x61 'a' ---> name[3]
0xbff5391f 0x00 '\0' ---> This is the NULL termination of the string
문자를 인쇄하려면 인쇄할 문자 값을 전달해야 한다.값은 이름[0] 또는 *이름(배열 이름 = &name[0])으로 참조할 수 있다.
문자열을 인쇄하려면 포인터를 인쇄할 문자열로 전달해야 한다(이 경우 '이름' 또는 '&name[0]').
%c
한 글자 한 글자만을 위해 디자인되어 하나의 요소만 인쇄한다.문자 배열을 포인터로 전달하면 배열의 첫 번째 요소(단일 문자) 주소를 전달하고 다음과 같이 인쇄된다.
s
printf("%c\n",*name++);
인쇄할 것이다
i
등등...
%s은 문자열을 사용하여 직접 작동할 수 있으므로 포인터가 필요하지 않다.
참조 해제 연산자를 포인터 유형 주석 *과 혼동하는 경우. 기본적으로 C *는 다른 위치에서 다른 것을 의미한다.
- 유형에서 *는 포인터를 의미한다.int는 정수 유형이고, int*는 정수 유형에 대한 포인터임
- 접두사 연산자로서 *는 '기각'을 의미한다.name은 포인터, *name은 포인터 참조를 취소한 결과(즉, 포인터가 가리키는 값 가져오기)
- 물론 infix 운영자로서 *는 '다중'을 의미한다.
배열의 이름은 첫 번째 요소의 주소이므로name
"시바"라는 문자열을 포함하는 메모리에 대한 포인터 입니다.
또한 문자를 표시하기 위해 포인터가 필요하지 않으며, 이 경우 배열에서 직접 포인터를 사용하도록 선택하기만 하면 된다.대신 이렇게 할 수 있다.
char c = *name;
printf("%c\n", c);
만약 당신이 하나의 문자를 표시하기를 원한다면 당신은 또한 사용할 수 있다.name[0]
포인터 대신.
목적에 부합하지만 다음 중 하나를 사용하여 전체 문자열을 표시하려면%c
, 다음을 사용해 보십시오.
#include<stdio.h>
void main()
{
char name[]="siva";
int i;
for(i=0;i<4;i++)
{
printf("%c",*(name+i));
}
}
중요한 것은 인쇄 기능에는 파라미터로 포인터가 필요하다는 것이다.그러나 char는 당신이 직접 가지고 있는 변수다.문자열은 문자열의 첫 번째 문자에 있는 포인터가므로 *는 변수의 포인터에 대한 식별자이므로 *를 추가할 필요가 없다.
참조URL: https://stackoverflow.com/questions/8019615/strings-and-character-with-printf
'IT이야기' 카테고리의 다른 글
Vuetify 사용 방법Google Places API를 사용한 JS Advanced 슬롯 예제 (0) | 2022.04.26 |
---|---|
Vuex 반환 부울? (0) | 2022.04.26 |
Vue 및 Webpack 트리 흔들림, sideEffects 및 CSS: 로드 중인 사용되지 않는 구성 요소의 CSS (0) | 2022.04.26 |
이 오류의 의미: "오류: 'type_name' 이전의 예상 지정자-qualifier-list" (0) | 2022.04.26 |
특정일을 넘겨서 요일을 결정하는 방법? (0) | 2022.04.26 |