development

scanf로 문자열 읽기

big-blog 2020. 6. 26. 07:45
반응형

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[]  
  1. 메모리에 자체 주소가있는 char 유형의 값 배열
  2. 배열의 요소만큼 연속 된 주소를 메모리에 자체 주소를 갖는 char 유형의 값 배열
  3. 종단 NULL 문자 등 '\0' &str, &str[0]str, 세 개의 어레이의 첫 번째 요소의 주소가 메모리의 동일한 위치를 나타낸다str

    char * strPtr = & str [0]; // 선언 및 초기화

또는 이것을 두 가지로 나눌 수 있습니다.

char *strPtr; strPtr = &str[0];
  1. strPtr 에 대한 포인터입니다 char
  2. strPtr 배열의 포인트 str
  3. strPtr 메모리에 자체 주소를 가진 변수
  4. strPtr 주소 값을 저장하는 변수입니다 &str[0]
  5. strPtr 메모리의 자체 주소가 저장 한 메모리 주소와 다릅니다 (메모리의 어레이 주소는 & str [0]).
  6. &strPtr strPtr 자체의 주소를 나타냅니다

포인터에 대한 포인터를 다음과 같이 선언 할 수 있다고 생각합니다.

char **vPtr = &strPtr;  

strPtr 포인터의 주소로 선언하고 초기화합니다

또는 두 가지로 나눌 수 있습니다.

char **vPtr;
*vPtr = &strPtr
  1. *vPtr strPtr 포인터의 포인트
  2. *vPtr 메모리에 자체 주소를 가진 변수
  3. *vPtr & strPtr 주소 값을 저장하는 변수입니다.
  4. 최종 의견 : 당신은 할 수 없습니다 str++, str주소는입니다 const, 그러나 당신은 할 수 있습니다strPtr++

참고 URL : https://stackoverflow.com/questions/5406935/reading-a-string-with-scanf

반응형