2014-04-22 4 views
1

을 scanf_s 내 코드입니다 :C 위치를 기록하는 동안 액세스 위반이 여기

main() 
{ 
    char firstName[30], lastName[30]; 
    printf("What is your name? "); 
    scanf_s("%s %s", firstName, lastName); 
    printf("Your name is %s %s\n", firstName, lastName); 
} 

내가는 scanf를 사용하여 시도했지만 VS 그것이 사용되지 않으며 scanf_s을 추천 있다고 말했다. 나는 문자열/char [] (이것은 의도 된 것)가 아니라면 변수 앞에 &/포인터를 사용한다는 것을 알고 있으며 실제로 어떤 오류인지 모릅니다. 어쩌면 그것은 방법 매개 변수일까요? 어떤 도움을 주셔서 감사합니다.

+3

표준 라이브러리의 절반을 폐기하기 위해 십자군을 무시하십시오. 원하는 경우 여기에서 scanf_s를 사용할 수 있습니다. 중요한 차이점은'char *'다음에 터미네이터를 포함한 버퍼의 크기가옵니다. – Deduplicator

+1

어쨌든, C를 배우고 싶다면, Microsoft 툴은 나쁜 선택입니다. 더 나은 GCC 또는 다른 고대 C 컴파일러를 시도하십시오. – Deduplicator

+0

감사합니다. 따라서 비추천 경고를 무시하는 것이 안전할까요? 그리고 나는 적당한 IDE를 사용할 수 있기를 바란다. (Java 용 IntelliJ에서 온 것이고, Eclipse는 나에게 무섭다. VIM은 어떨까? : D). Microsoft 도구에는 VS가 포함되어 있습니까? – user3561659

답변

5

MS는 표준 C 기능을 "안전한"버전으로 바꾸는 습관이 있지만 scanf_s는 이러한 구현 중 하나입니다.

http://msdn.microsoft.com/en-us/library/w40768et.aspx 난 당신이 변화 할 경우 오류가 사라질 것으로 예상 : 워드 프로세서 현재 나는 또한 언어의 자신의 부패 주위에 얻을 수있는 방법이 생각

scanf_s("%s %s", firstName, _countof(firstName), lastName, _countof(lastName)); 

을,하지만 난 MSVC 사용을 중단 몇 년 전에 정확하게 이런 이유로.

+0

C 표준에 대한 더 나은 링크, 선택적 섹션 : [Technical corrigenda TC1, TC2 및 TC3이 포함 된 C99] (http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf)) – Deduplicator

+0

또는 모든 C 구현에서 영원히 작동하는'if (scanf ("% 29s % 29s", firstName, lastName)! = 2)/* error * /;를 사용하십시오. – pmg

+0

여러분, 고맙습니다. MSVC 사용을 중단 했다며 지금 무엇을 사용합니까? 왜이 '안전한'방법이 부패합니까? 사면 내 질문, 그냥 알고 싶어요 :) – user3561659

관련 문제