简单的c错误使指针从整数变为不带强制转换的整数
我在k&r手册的帮助下学习了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
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;isprintf
用于根据某些格式创建字符串。看起来您需要输出,因此您需要使用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 {}