简单的c错误使指针从整数变为不带强制转换的整数

简单的c错误使指针从整数变为不带强制转换的整数,c,pointers,C,Pointers,我在k&r手册的帮助下学习了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 vers

我在k&r手册的帮助下学习了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;

}
main.c:11:警告:传递'sprintf'的参数2将从整数生成指针,而不进行强制转换
#包括
/*将输入复制到输出;第一版*/
main(){
int i;
整数幂(整数基,整数n);
对于(i=0;i<10;i++){
sprintf(“%d%d%d\n”,i,power(2,i),power(-3,i));
返回0;
}
}
整数幂(整数基,整数n){
int i;
INTP;
p=1;

for(i=1;i
sprintf
用于根据某些格式创建字符串。看起来您需要输出,因此您需要使用
printf


另外,
返回0;
不应包含在
for
循环中。这将导致程序在一次迭代后终止。

来自
man sprintf
: intsprintf(字符*str,常量字符*格式,…)

sprintf的第一个参数是您分配的字符串

如果要打印到标准输出(通常是运行程序的终端),请使用
printf

sprintf()
需要一个字符串作为第一个和第二个参数

第一个字符串指定要存储结果的字符串,第二个字符串是格式字符串


您可能希望使用
printf()
而不是
sprintf()

sprintf()
的第一个参数是您应该打印到的缓冲区。第二个参数是格式字符串

(也考虑使用<代码> SNPROTFF)(< /代码>——编写更安全的代码不太容易超出缓冲区)。

< P>这只是一个编译器警告,但是如果没有得到任何错误消息,进程应该已经成功完成。 您可以通过在第11行添加显式强制转换来绕过警告。。
在谷歌上查看;)

对于所有不知道返回循环的人 以下各项之间存在差异:

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

for(i=1;i)为什么在你的
for
循环中有一个
return
?代码与书中的“原样”一模一样。返回是个问题吗?我必须拿出我的K&R副本,因为那是一些古怪的代码。@配音:那绝对不是“原样”您在
printf
return
语句周围添加了一组大括号。是的,您也在
sprintf
中错误地键入了
printf
。我们都会犯错误,有时是在公开场合警告总是表示编码不好。在这种情况下,它揭示了一个错误,即使用了错误的函数或缺少参数。是的,但我的观点是,主题说这是一个错误,而事实并非如此。
for (i = 1; i <= n; ++i){
    p = p * base;    //inside
    return p;}       //inside because brackets {}