Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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,我对C语言编程非常陌生,对。。。我被要求在C代码的某些片段中查找错误。。。这一部分让我有点困惑,所以非常感谢您的帮助 int main(void) { int myInt = 5; printf("myInt = %d"); return 0; } 据我所知,这段代码没有错。我想知道的是为什么这句话会打印出一个随机数 我得到的输出是 myInt = 1252057154 非常感谢你的帮助。。。谢谢应该是这样的: printf("myInt = %d",myI

我对C语言编程非常陌生,对。。。我被要求在C代码的某些片段中查找错误。。。这一部分让我有点困惑,所以非常感谢您的帮助

int main(void)     
{
    int myInt = 5;
    printf("myInt = %d");
    return 0;
}
据我所知,这段代码没有错。我想知道的是为什么这句话会打印出一个随机数

我得到的输出是

myInt = 1252057154
非常感谢你的帮助。。。谢谢

应该是这样的:

printf("myInt = %d",myInt);
如果不包含该变量,那么它基本上会随机抽取一块内存。此外,如果您使用更大的代码块执行此操作,可能会导致更多的wierd内容发生。始终确保从printf语句中获得所需的尽可能多的变量,否则会产生不好的结果

int main(void)     
{
    int myInt = 5;
    printf("myInt = %d",myInt);
    return 0;
}

代码中唯一的变化是我在printf语句中添加了myInt变量(如果您在末尾看到的话)。每当给变量赋值时,它只能通过将其传递给printf()函数和相应的类型说明符来显示。这是C中的一条规则。

如果它打印错误,问题出现在
printf
调用中:

printf("myInt = %d");

您希望传递哪些参数?

您应该阅读更多关于C编程的内容

编译时应启用所有警告和调试。对于GCC,这意味着
GCC-Wall-Wextra-g
(至少在Linux上)

当使用

gcc -Wall -Wextra -g john.c -o john
我收到以下警告:

john.c: In function ‘main’:
john.c:4:5: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
john.c:4:5: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
john.c:4:5: warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat]
john.c:3:9: warning: unused variable ‘myInt’ [-Wunused-variable]
因此,修正很简单:

/* file john.c */
#include <stdio.h>
int main(void)     
{
  int myInt = 5;
  printf("myInt = %d\n", myInt);
  return 0;
}
/*文件john.c*/
#包括
内部主(空)
{
int-myInt=5;
printf(“myInt=%d\n”,myInt);
返回0;
}
在没有警告的情况下编译

请注意
printf
格式字符串末尾的
\n
。这很重要

始终启用编译器可以给您的所有警告并信任编译器,因此请更正代码,直到没有警告为止

学习使用调试器(例如Linux上的
gdb

您观察到的行为是未定义的行为
;任何符合标准的C实现都可能发生(甚至是爆炸)

快乐黑客。

printf
(和类似的scanf)的工作原理如下:

假设您调用了
printf

printf("%d some text %f %u %hu some more text\n", arg1, arg2, arg3, arg4)
printf
根据

%d some text %f %u %hu some more text
 |           |   |  |
arg1       arg2  |  arg4
                arg3
现在函数接受可变数量的参数的原因是,它们不知道参数是否存在,这就是为什么它们只根据格式字符串从堆栈的特定部分获取数据。如果你写:

printf("%d %f %u\n");

它从堆栈中读取三个不存在的数据,很可能是调用函数时存储的值(应该隐藏的值)

printf是一个接收一个或多个参数的函数。 在您的例子中,它只收到一个参数(这是合法的),但该参数包含%d,它告诉printf接受第二个参数,而不是%d。
printf从堆栈中获取“第二个参数”,因为只有一个参数被推送到堆栈(字符串),所以它使用返回地址作为第二个参数。

仔细查看您的
printf()
调用并询问您自己,它如何知道要打印哪个值?原型的相关部分是点:)
intprintf(constchar*fmt,…)
打印myInt,它怎么知道你希望它打印什么数字?如果你的程序中有两个
int
s,你想打印哪一个?很好,但是对于新手来说,没有解释!