Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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 printf()不使用双引号,打印随机字符_C_Printf_Dev C++ - Fatal编程技术网

C printf()不使用双引号,打印随机字符

C printf()不使用双引号,打印随机字符,c,printf,dev-c++,C,Printf,Dev C++,我在一次大学测试中偶然发现了这段C代码,当我在Dev-C++5.11编译器上测试它时,它打印了随机字符。我不明白这段代码是如何工作的,为什么工作的。有人能启发我吗 int main() { char a[10] = "%s" ; printf( a ) ; } printf函数签名是: int printf(const char *format, ...); 它期望format string作为第一个参数,并根据format string中的格式说明

我在一次大学测试中偶然发现了这段C代码,当我在Dev-C++5.11编译器上测试它时,它打印了随机字符。我不明白这段代码是如何工作的,为什么工作的。有人能启发我吗

 int main() {
        char a[10] = "%s" ;
        printf( a ) ;
    }

printf
函数签名是:

int printf(const char *format, ...);
它期望format string作为第一个参数,并根据format string中的格式说明符处理和打印可变数量的参数。问题中的变量
a
为其提供格式字符串。出现随机字符的原因是缺少格式说明符
%s
的参数。以下内容将正确打印字符串:

printf( a, "Hello World!" );
这里可以看到格式说明符列表

它为什么要编译?


因为
printf
接受的变量参数是在运行时处理的。并非所有编译器都执行编译时检查,以根据格式字符串验证参数。即使他们这样做了,他们最多也会抛出一个警告,但仍然会编译程序。

printf
函数签名是:

int printf(const char *format, ...);
它期望format string作为第一个参数,并根据format string中的格式说明符处理和打印可变数量的参数。问题中的变量
a
为其提供格式字符串。出现随机字符的原因是缺少格式说明符
%s
的参数。以下内容将正确打印字符串:

printf( a, "Hello World!" );
这里可以看到格式说明符列表

它为什么要编译?

因为
printf
接受的变量参数是在运行时处理的。并非所有编译器都执行编译时检查,以根据格式字符串验证参数。即使他们这样做了,他们最多也会抛出一个警告,但仍然会编译程序。

它使用字符串“%s”作为格式字符串,使用未初始化的内存作为“数据”

它做“某事”的唯一原因是编译器显然不够聪明,无法识别格式字符串需要一个参数,而提供了零个参数。或者因为编译器警告被忽略和/或错误被关闭

对于任何遇到这种情况的人来说,仅供参考:“始终启用所有警告和错误,并在它们消失之前修复代码”。这并不能保证行为正确,但确实会减少出现“神秘”问题的可能性。

它使用字符串“%s”作为格式字符串,使用未初始化的内存作为“数据”

它做“某事”的唯一原因是编译器显然不够聪明,无法识别格式字符串需要一个参数,而提供了零个参数。或者因为编译器警告被忽略和/或错误被关闭


对于任何遇到这种情况的人,仅供参考:“始终启用所有警告和错误并修复代码,直到它们消失”。这并不能保证行为正确,但确实会减少出现“神秘”问题的可能性。

这个问题有两个部分:缺少的引号和随机字符

  • printf()
    只是一个函数。可以将字符串和其他值作为参数传递给函数。你不必使用文字。您可以同时使用
    char*a=“something”;printf(a)
    (将变量作为参数传递)和
    printf(“某物”)
    (将字符串文本作为参数传递)
  • printf()。这意味着它可以接受任意数量的参数。您可以使用
    printf(“hello world”)
    printf(“%s”、“hello world”)
    甚至
    printf(“%s%s”、“hello”、“world”)
    。一些较旧的编译器不会验证您是否根据第一个参数(格式字符串)实际传递了正确数量的参数。这就是为什么代码即使缺少参数也会编译。程序运行时,代码将遍历格式字符串,查看
    “%s”
    ,并查找第二个参数以将其打印为字符串。因为没有第二个参数,所以它基本上读取随机内存,然后得到垃圾字符
    这个问题有两部分:缺少的引号和随机字符

  • printf()
    只是一个函数。可以将字符串和其他值作为参数传递给函数。你不必使用文字。您可以同时使用
    char*a=“something”;printf(a)
    (将变量作为参数传递)和
    printf(“某物”)
    (将字符串文本作为参数传递)
  • printf()。这意味着它可以接受任意数量的参数。您可以使用
    printf(“hello world”)
    printf(“%s”、“hello world”)
    甚至
    printf(“%s%s”、“hello”、“world”)
    。一些较旧的编译器不会验证您是否根据第一个参数(格式字符串)实际传递了正确数量的参数。这就是为什么代码即使缺少参数也会编译。程序运行时,代码将遍历格式字符串,查看
    “%s”
    ,并查找第二个参数以将其打印为字符串。因为没有第二个参数,所以它基本上读取随机内存,然后得到垃圾字符
    如果它打印的是随机字符,你怎么能断言它“有效”?因为它可以编译?除非你编写了一个随机生成字符并打印它们的程序,否则我不会说打印随机字符有效。试着去掉变量“a”并将字符串直接放入printf()中调用,应该很明显发生了什么。实际的问题是它为什么要编译?因为C非常幼稚。它认为程序员知道他们在做什么。如果是打印随机字符,你怎么能断言它“有效”?因为它可以编译吗?除非你写了一个随机生成并打印字符的程序,否则我不会说打印随机字符有效。试着去掉t