2010-11-22 4 views
3

저는 k & r 설명서를 사용하여 c를 배웠습니다. 꽤 흥미 진진하지만 일찍 문제를 겪었고 문제를 해결하는 방법을 모르겠습니다.간단한 c 오류로 인해 캐스트가없는 정수에서 포인터가 생깁니다.

정말 간단한 샘플 코드를 사용하려고하는데 다음 오류가 발생합니다. 나는 왜 코드가 책에서 곧바로 나오는지 이해하지 못한다.

main.c:11: warning: passing argument 2 of ‘sprintf’ makes pointer from integer without a cast 


#include <stdio.h> 

/* copy input to output; 1st version */ 
main() { 
    int i; 
    int power(int base, int n); 

    for (i = 0; i < 10; i++) { 
     sprintf("%d %d %d\n", i ,power(2, i), power(-3, i)); 
     return 0; 
    } 



} 

int power(int base, int n) { 
    int i; 
    int p; 

    p = 1; 

    for (i = 1; i <= n; ++i) 
     p = p * base; 
    return p; 

} 

나는 다시가는 길에 나귀를 주셔서 감사합니다.

+2

왜'for' 루프 안에'return'이 있습니까? –

+0

코드는 책의 "있는 그대로"입니다. 반환 문제입니까? – dubbeat

+1

나는 K & R의 복사본을 가져와야 할 것입니다. 왜냐하면 그것은 FUNKY 코드이기 때문입니다. – birryree

답변

5

sprintf은 일부 서식을 기반으로 문자열을 생성하기위한 것입니다. 출력을 원하는 것처럼 보이므로 printf을 사용하고 싶습니다.

또한 return 0;for 루프에 포함되어서는 안됩니다. 한 번 반복 한 후에 프로그램이 종료됩니다.

3

man sprintf : int sprintf (char * str, const char * format, ...);

sprintf의 첫 번째 인수는 할당 한 문자열입니다.

표준 출력 (일반적으로 프로그램을 실행하는 터미널)에 인쇄하려면 printf을 대신 사용하십시오.

0

은 첫 번째 및 두 번째 인수로 문자열을 필요로합니다.

첫 번째 것은 결과를 저장할 문자열을 지정하고 두 번째 것은 결과 문자열을 지정합니다.

sprintf() 대신 printf()을 사용할 수 있습니다.

0

sprintf()의 첫 번째 인수는 인쇄 할 버퍼입니다. 두 번째는 형식 문자열입니다.

(또한 snprintf()를 사용하는 것이 좋습니다 - 버퍼 오버런하지 않는 안전한 코드를 작성하는 것이 훨씬 더 쉽다.)

0

이이 경고 단지 컴파일러 이지만, 경우 프로세스가 성공적으로 완료해야 오류 메시지를받을 didnt는 ... 는 11 줄을 명시 적 캐스트를 추가하여 경고 주위를 얻을 수 있습니다 .. 구글에 "type casting c"에 대한 검사) 그나마 모두에게

+2

경고는 항상 잘못된 코딩의 지표입니다. 이 경우 잘못된 함수가 사용되거나 인수가없는 버그가 나타납니다. – mouviciel

+0

사실, 제 요점은 과목이 오류라고 말하지만 그렇지 않은 것이 었습니다. – fasseg

1

가 반환 와 루프 abouwt 알고 다음 사이의 차이 :

for (i = 1; i <= n; ++i) 
    p = p * base; //inside 
return p;   //outside because no brackets {} 

과는 : 당신이 문 루프 또는 경우 괄호를 사용하지 않는 경우

for (i = 1; i <= n; ++i){ 
    p = p * base; //inside 
    return p;}  //inside because brackets {} 

만 직접 다음 줄이 실행됩니다. 이 반환은 루프 외부입니다.

관련 문제