为什么下面的程序
#include <stdio.h>
#include <wchar.h>
int main() {
wprintf(L"??????, ???!");
}
Run Code Online (Sandbox Code Playgroud)
打印“女贞,先生!” 在 Linux 上?具体来说,为什么它将 Unicode 中的俄语文本音译为拉丁语,而不是将其转码为 UTF-8 或使用替换字符?
在 Godbolt 上演示此行为:https ://godbolt.org/z/36zEcG
非宽版会printf("??????, ???!")按预期打印此文本(“??????, ???!”)。
pixel_data是vector的char.
当我这样做时,printf(" 0x%1x ", pixel_data[0] )我期待着看到0xf5.
但我觉得0xfffffff5我打印出一个4字节的整数而不是1字节.
为什么是这样?我给printf了一个char打印输出 - 它只有1个字节,为什么printf打印4?
NB.在printf实现包裹第三方API内,但只是想知道,这是标准的功能printf?
我有一个虚假的问题.我想将一个整数打印到带有0的缓冲区填充中,但我无法将其排序sprintf.我正在尝试以下方面
char buf[31];
int my_val = 324;
sprintf( buf, "%d030", my_val );
Run Code Online (Sandbox Code Playgroud)
希望有以下字符串
"000000000000000000000000000324"
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?它不代表填充0,最大宽度为30个字符?
我很困惑
let test = "aString"
let callMe =
printfn test
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?在编译时抛出以下错误:
类型'string'与'Printf.TextWriterFormat <'a>'类型不兼容
这很好用:
printfn "aString"
Run Code Online (Sandbox Code Playgroud) 能帮我理解这个简单代码的输出吗?
const char str[10] = "55\01234";
printf("%s", str);
Run Code Online (Sandbox Code Playgroud)
输出是:
55
34
Run Code Online (Sandbox Code Playgroud) 在跨平台的c/c ++项目(Win32,Linux,OSX)中,我需要使用*printf函数来打印一些size_t类型的变量.在某些环境中,size_t是8个字节,而在其他环境中它们是4.在glibc上我有%zd,在Win32上我可以使用%Id.有一种优雅的方式来处理这个问题吗?
我有一种情况,我想printf两次使用我的论点.
fmt.Printf("%d %d", i, i)
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉fmt.Printf重用同样的东西i?
fmt.Printf("%d %d", i)
Run Code Online (Sandbox Code Playgroud) 我们有一个需要确定性的游戏,因为它是多人游戏模型的一部分.我们还使用Lua,它在sprintf内部使用(格式为%.14g).
打印数字如0.00001时会出现问题.在某些情况下,它会打印1e-05,在某些情况下,它会打印1e-005(额外为零).
例如,当使用Visual Studio 2015进行编译时,它会进行打印1e-005,并使用Visual Studio 2013进行打印1e-05.我尝试了不同的区域设置,但似乎没有任何效果.
问题是:实现确定性结果的最佳解决方案是什么? 我不关心科学记谱法是否标准化或消除.
我想到的解决方案:
%f符号时,它不会忽略无关紧要的零,因此%.14f会导致不切实际的长数.sprintf方法(从某些标准库粘贴的副本)根据C标准(6.5.2.2第6段)
如果表示被调用函数的表达式具有不包含原型的类型,则对每个参数执行整数提升,并将具有float类型的参数提升为double.这些被称为默认参数促销.如果参数的数量不等于参数的数量,则行为未定义.如果函数是使用包含原型的类型定义的,并且原型以省略号(,...)结尾,或者促销后的参数类型与参数类型不兼容,则行为未定义.如果函数是使用不包含原型的类型定义的,并且促销后的参数类型与促销后的参数类型不兼容,则行为未定义,但以下情况除外:
- 一个提升类型是有符号整数类型,另一个提升类型是相应的无符号整数类型,并且该值可在两种类型中表示;
- 这两种类型都是指向字符类型或空格的限定或不合格版本的指针.
因此,一般来说,只要传递的值适合两种类型,传递int到需要unsigned int(或反之亦然)的可变函数是没有错的.但是,printf读取规范(7.19.6.1第9段):
如果转换规范无效,则行为未定义.如果任何参数不是相应转换规范的正确类型,则行为未定义.
签名/未签名不匹配也不例外.
这是否意味着printf("%x", 1)调用未定义的行为?