Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 给出错误的函数和参数_C_Printf - Fatal编程技术网

C 给出错误的函数和参数

C 给出错误的函数和参数,c,printf,C,Printf,下面这段代码的结果应该是30,但是当编译和运行时,这会给我以下结果 the result of 2358968 and 0 is 4200271, a , b , result 我 我不明白当我没有那个值的变量时,结果怎么会是这样 #include<stdio.h> #include<conio.h> void add( int , int ); int main(){ add(10,20); getch(); return 0 ; }

下面这段代码的结果应该是30,但是当编译和运行时,这会给我以下结果

the result of 2358968 and 0 is 4200271, a , b , result
我 我不明白当我没有那个值的变量时,结果怎么会是这样

#include<stdio.h>
#include<conio.h>

void add( int , int );   

int main(){
    add(10,20);
    getch();
    return 0 ;
}


void add(int a, int b){
    int result = a + b;
    printf("the result of the %d and %d is %d, a, b, result");  
}
#包括
#包括
无效添加(int,int);
int main(){
增加(10,20);
getch();
返回0;
}
无效添加(内部a、内部b){
int结果=a+b;
printf(“%d和%d的结果是%d,a,b,result”);
}
在您的代码中

printf("the result of the %d and %d is %d, a, b, result");
应该是

 printf("the result of the %d and %d is %d\n", a, b, result);
                                           ^
                                           |
                                     //format string ends here
    // arguments for format specifiers are meant to be 
   // supplied as different arguments to `printf()`, not as a part of <format> string itself
 printf("<format>", var1, var2,....);
提供的变量不是
格式的一部分

代码中的问题是缺少所提供格式说明符的变量(参数)。根据
C11
标准第7.21.6.1章第2段

[…]如果格式的参数不足,则该行为为 未定义。[……]

因此,您的代码会打印出一些垃圾值

故事的寓意:如果启用了编译器警告,编译器应该警告您
printf()
中缺少(不匹配)图形。因此,请始终启用警告。

对您的大多数问题;他正确地建议在编译时启用所有警告。如果您的编译器(尤其是在Linux上)是最新的或将
-Wall-Wextra-g
传递到
gcc
clang
命令(以获取几乎所有警告、一些额外警告和调试信息)。其他编译器选项(
-fsanize=address
等)和其他工具(gdb
调试器、工具,
strace
,…)也可能有用

我不明白当我没有这个值的变量时 结果会是这样吗

#include<stdio.h>
#include<conio.h>

void add( int , int );   

int main(){
    add(10,20);
    getch();
    return 0 ;
}


void add(int a, int b){
    int result = a + b;
    printf("the result of the %d and %d is %d, a, b, result");  
}
因为你遇到过。阅读更多关于它的信息(特别是Lattner的博客),并努力在任何情况下都避免它。请注意,使用UB时,您的(或任何其他)程序似乎可以工作,但实际上它有一些未定义的行为

打印的特定垃圾(或明显随机)值:可能不可复制,只能通过深入了解每个实现细节来解释,包括查看特定编译器生成的机器代码和检查某些机器状态(寄存器值);具体来说,系统上的
printf
实现可能使用了一些东西,并从未初始化的内存或寄存器中获取了一些值,而这些内存或寄存器恰好具有一些以前的“垃圾”值(在机器级别)

另请参见(以及许多其他)关于未定义行为的内容。努力工作,总是避免它。
记住,当编码(即使是C)时,你最终是在为一些虚拟或抽象机器编码,而这些机器不是真正的计算机。即使从操作系统内核中编写所有软件级别(至少需要几十年时间),您也在为某些特定的抽象编写代码,您必须忽略计算机在这些抽象之外的一些错误行为(例如,如果计算机发生故障,获取一些宇宙射线等)。或编程语言标准规范(几百页的英文技术文档)以及操作系统规范是编写软件代码的有用抽象。printf语句是产生不希望的输出的原因

printf("the result of the %d and %d is %d, a, b, result");
没有为格式说明符指定参数,必须更改
的位置

声明应该是这样的

printf("the result of the %d and %d is %d", a, b, result);
在printf语句中,它接受的是垃圾值,因为没有为
%d

指定任何参数。您已经关闭了行末尾的
。在
printf
函数中,您指定了
%d
,因此
%d
将不具有指向和获取值的变量

您将收到警告消息,
%d需要匹配的int

它将在该位置有垃圾值,因此它正在打印一些值。

printf(“%d和%d的结果是%d,a,b,result”); 一定是这样 printf(“第%d个和第%d个的结果是第%d个”,a,b,result); 它将从左侧读取并分配%d值以进行写入。
printf返回字符数

没有帮助,只需添加一个换行符,值将如何变化?@PratikRatnaparkhi是您注意到的唯一变化吗?如果是的话,那么,请仔细看看。:-)色盲模式下语法高亮显示的替代方法是什么?:)我要找的答案是30,我得到一些随机值,即使在添加新行后,您还没有关闭“在你的代码中?我很困惑。嘿,对不起。我现在得到了答案,但你能解释一下为什么早些时候它给了我这样一个随机值吗?如果它还说了未定义的行为是什么,答案会更好。我给了一个维基百科的链接。UB太难用几句话来解释,真的吗?“您使用了一个vararg函数,但没有根据格式字符串中给出的信息给出适当数量的参数”@user2225104在我的回答中添加了一些描述。请检查这是否有帮助。
printf(“%d和%d的结果是%d\n”,a,b,result)