scanf로 문자열 읽기
나는 무언가에 대해 약간 혼란스러워합니다. 나는 C 문자열을 읽는 올바른 방법 scanf()
이 라인을 따라 갔다 는 인상을 받았다.
(가능한 버퍼 오버플로를 염두에 두지 말고 간단한 예일뿐입니다)
char string[256];
scanf( "%s" , string );
그러나 다음과 같이 작동하는 것 같습니다.
scanf( "%s" , &string );
이것은 내 컴파일러 (gcc), 순수한 운 또는 다른 것입니까?
배열은 첫 번째 요소에 대한 포인터로 "부패"하므로 scanf("%s", string)
에 해당합니다 scanf("%s", &string[0])
. 반면에 scanf("%s", &string)
pointer-to-를 전달 char[256]
하지만 같은 위치를 가리 킵니다.
그런 다음 scanf
인수 목록의 꼬리를 처리 할 때을 꺼내려고합니다 char *
. string
또는에 전달했을 때 올바른 &string[0]
것이지만, 전달 했을 때 &string
언어 표준이 보장하지 않는 것, 즉 포인터 &string
와 &string[0]
-가 다른 유형과 크기의 객체에 대한 포인터에 의존하고 있습니다. 같은 장소에서 시작-같은 방식으로 표현됩니다.
나는 그것이 작동하지 않는 시스템을 만난 적이 있다고 생각하지 않으며 실제로 당신은 아마 안전 할 것입니다. 그보다 적은 것은 틀 렸으며 일부 플랫폼에서는 실패 할 수 있습니다. (가설의 예 : 모든 포인터와 함께 유형 정보를 포함하는 "디버깅"구현. Symbolics "Lisp Machines"에 대한 C 구현은 이와 같은 방식으로 생각 합니다.)
나는 이것이 아래에 정확하고 도움이 될 것이라고 생각합니다. 오류가 있으면 언제든지 수정하십시오. 저는 C에서 처음입니다.
char str[]
- 메모리에 자체 주소가있는 char 유형의 값 배열
- 배열의 요소만큼 연속 된 주소를 메모리에 자체 주소를 갖는 char 유형의 값 배열
종단 NULL 문자 등
'\0'
&str
,&str[0]
및str
, 세 개의 어레이의 첫 번째 요소의 주소가 메모리의 동일한 위치를 나타낸다str
char * strPtr = & str [0]; // 선언 및 초기화
또는 이것을 두 가지로 나눌 수 있습니다.
char *strPtr; strPtr = &str[0];
strPtr
에 대한 포인터입니다char
strPtr
배열의 포인트str
strPtr
메모리에 자체 주소를 가진 변수strPtr
주소 값을 저장하는 변수입니다&str[0]
strPtr
메모리의 자체 주소가 저장 한 메모리 주소와 다릅니다 (메모리의 어레이 주소는 & str [0]).&strPtr
strPtr 자체의 주소를 나타냅니다
포인터에 대한 포인터를 다음과 같이 선언 할 수 있다고 생각합니다.
char **vPtr = &strPtr;
strPtr 포인터의 주소로 선언하고 초기화합니다
또는 두 가지로 나눌 수 있습니다.
char **vPtr;
*vPtr = &strPtr
*vPtr
strPtr 포인터의 포인트*vPtr
메모리에 자체 주소를 가진 변수*vPtr
& strPtr 주소 값을 저장하는 변수입니다.- 최종 의견 : 당신은 할 수 없습니다
str++
,str
주소는입니다const
, 그러나 당신은 할 수 있습니다strPtr++
참고 URL : https://stackoverflow.com/questions/5406935/reading-a-string-with-scanf
'development' 카테고리의 다른 글
브라우저에서 JavaScript를 샌드 박스로 실행할 수 있습니까? (0) | 2020.06.26 |
---|---|
iOS 5 고정 위치 및 가상 키보드 (0) | 2020.06.26 |
간단한 파이썬 웹 서비스를 만드는 가장 좋은 방법 (0) | 2020.06.26 |
왜 {} + {}가 클라이언트 측에서만 NaN입니까? (0) | 2020.06.26 |
데이터베이스 스키마를 시각화하는 좋은 도구? (0) | 2020.06.26 |