2016-08-22 10 views
0

나는 C를 배우고 있습니다. 그래서이 거리 타이머 프로그램을 작성했습니다. gnu-gcc 컴파일러로 잘 실행됩니다. 그러나 avr에 대한 gnu-gcc는 컴파일되지만 실행하면 아무 버튼이나 누르면 사라지는 것을 제외하고는 아무것도 수행하지 않는 cmd 세션 만 진행됩니다. 이유를 알고 싶습니다. 버퍼 오버 플로우에 방법 :내 프로그램은 gnu-gcc에서 잘 실행되지만 gnu gcc에서는 avr이 아닙니다.

내가 여기에 코드 블록을 사용하고 나의 코드 당신은 아마 이유 gets으로 실행하는

#include<stdio.h> 
#include<stdlib.h> 
#define speedpersecond 5 

int main() 

{ 

char time [5]; 

double distance; 

printf("Please enter time in seconds"); 

gets(time); 

distance = atoi(time) * speedpersecond; 

printf("Distance is %g ", distance); 

return 8585; 

} 
+2

'gets'를 사용하지 마십시오. 그리고 왜 8585를 돌려 주나요? 돌아 가기보십시오 0 – stackptr

+0

아무런 차이가 없으므로 숫자를 반환 할 것이라고 생각하지 마십시오. –

+1

Mmh ... gcc-avr로 컴파일 한 프로그램을 어디에서 실행합니까? PC 또는 마이크로 컨트롤러에서? – deamentiaemundi

답변

1

는 C99 표준부터 사용되지 않습니다, 그리고 C11 표준에 완전히 제거 된 것입니다 쉬운.

4 개 이상의 문자를 입력하면 gets은 배열의 범위를 벗어나서 의 정의되지 않은 동작을 갖게됩니다.

대신 안전한 방법으로 라인을 읽으려면 fgets을 사용하십시오.


과 관련하여 그 main 기능에서 return. 많은 시스템 (예 : macOS와 Linux와 같은 POSIX 시스템)은 반환 값으로 8 비트를 사용합니다. 또한, 0은 아니지만 셸과 호출 환경에 의해 실패로 간주됩니다.

atoi 함수에는 중대한 오류 검사가 없습니다. 전달한 문자열에 다음과 같은 내용이 포함되어 있는지 여부는 알 수 없습니다. "0" 또는 숫자가 전혀 없습니다. 두 경우 모두 0을 반환합니다. 오류를 감지하는 데 도움이되는 더 안전한 함수는 strtol 함수입니다.

+0

좋아, strtol 함수는 atoi와 같은 방식으로 사용됩니까? –

+0

예를 들어 주시겠습니까? –

+0

@AllanMayers 링크를 따라 가면 예제가있는 참조로 연결됩니다. –