문제

내가 컴파일 할 때 scanf("%s", &var);, GCC는 경고를 다시 보냅니다.

warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[20]’

그러나 내가 컴파일 할 때 scanf("%s", var);, 경고는 적용되지 않습니다. 코드 작품과 내가 읽고있는 책은 모두 앰퍼 랜드를 사용한다고 말하지만 일부 예제에서는 그렇지 않습니다.

내 질문은 책이 지정하지 않더라도 암페어를 계속 사용해야 하는가?

도움이 되었습니까?

해결책

당신이 게시 한 내용에서 var char 배열입니다. 이 경우에는 앰퍼 샌드가 필요하지 않습니다. var 필요에 따라 (char *)로 평가됩니다.

세부:

Scanf는 입력을 저장하는 변수에 대한 포인터가 필요합니다. 문자열의 경우, 읽을 수있는 문자열을 저장할 수있을 정도로 큰 메모리의 배열에 대한 포인터가 필요합니다. char var[100], 당신은 100을위한 공간을 만듭니다 chars var [0]가 100 번째 숯을 언급하는 첫 번째 char와 var [99]를 언급합니다. 배열 이름 자체는 &var[0], 이것은 시퀀스의 첫 번째 문자에 대한 포인터이며, Scanf가 필요로하는 것입니다. 그래서 당신이해야 할 일은입니다 scanf("%s", var);, 그러나 그것을주의하십시오 scanf 입력 문자열의 크기 제약 조건을 시행하지 않으므로 사용자가 101 길이 문자열을 입력하면 버퍼 오버런이있어 버그가 발생하거나 보안 문제가 발생합니다. 더 나은 선택은 일반적으로입니다 fgets 입력 문자열의 크기 제약 조건을 허용합니다.

다른 팁

나는 다른 답변자를 초대하여 여기에서 포인터와 참고 문헌을 잘 요약합니다. 나는 여기저기서 실수를하지 않고 그렇게 할 수 있다고 생각하지 않으며, 뒤 따르는 괴상한 분노를 다룰 의도가 없습니다.

그래서 나는 당신에게 좋은 것을 가리 킵니다 자원 문제의 핵심에있는 포인터와 참고 문헌에 대해 배우기 위해. http://www.cplusplus.com/doc/tutorial/pointers/

제거하십시오 & ~로부터 scanf("%s", &var); 그렇습니다 scanf("%s", var);.

이와 같은 배열을 사용할 때 :

char name[20];

20 숯으로 구성된 메모리 영역이 그것과 관련되어 있음을 고려해야합니다. 해당 메모리 영역의 시작 주소를 얻으려면 배열의 이름을 사용해야하며 해당 배열의 단일 숯의 주소를 얻으려면 다음과 같은 sintax를 사용해야합니다. & name [i].
Scanf를 사용하여 문자열을 읽습니다. C.의 char 배열 인 Scanf는 읽을 변수 유형과 관련된 메모리 영역의 주소가 필요합니다. 이 경우 배열을 읽고 있으므로 이름 만 사용해야합니다. 배열이 아닌 단일 변수를 읽으려면 암페어를 사용해야합니다. 예를 들어:

char myChar;
scanf("%c", &myChar);

이것이 도움이되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top