C printf()不使用双引号,打印随机字符
我在一次大学测试中偶然发现了这段C代码,当我在Dev-C++5.11编译器上测试它时,它打印了随机字符。我不明白这段代码是如何工作的,为什么工作的。有人能启发我吗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中的格式说明
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