用printf保留特殊字符的格式

问题描述

| 我从.net样式({0} ...)切换为printf样式格式,并注意到不再保留特殊字符的格式。 用printf保留格式的技术是什么? 我正在做类似“ 0”的事情。 我知道StringFormat会生成文字字符串(前缀为@ \“ \”),但printf不会。 编辑: 我基本上想保留格式,例如反斜杠。如果我要打印出文件路径,我希望看到\“ C:\\ Program Files ... \”不受干扰,就像将打印StringFormat一样。     

解决方法

F#中的字符串文字有两种类型:普通字符串文字(类似于
\"string\"
)和逐字字符串文字(类似于
@\"string\"
)。无论哪种方式,字符串都将成为内存中.NET
System.String
类型的实例,本质上只是strings4ѭ值的序列。如果要创建包含某些字符(例如反斜杠)的字符串,则在使用常规字符串文字::5ѭ时应转义它们,但在使用逐字字符串文字:
@\"C:\\Program Files\\...\"
时,则无需这样做。无论哪种方式,内存中的值都将包含字符\'C \',\':\',\'\\\',\'P \',\'r \'等。您可能会发现忘记转义反斜杠并不总是会导致问题,因为反斜杠仅在特定字符前面出现时才被解释为转义序列(因此,您可以with7ѭ而不是
\"C:\\test\"
)。 一旦值存储在内存中,
String.Format
printf
函数家族的工作方式基本上相同:
let sf1 = System.String.Format(\"{0}\",\"C:\\\\test\")
let sf2 = System.String.Format(\"{0}\",@\"C:\\test\")
let pf1 = sprintf \"%s\" \"C:\\\\test\"
let pf2 = sprintf \"%s\" @\"C:\\test\"
您会发现所有这些值都是相同的(并且在正确的位置包含反斜杠)。同样地:
let sf_bad = System.String.Format(\"{0}\",\"C:\\test\")
let pf_bad = sprintf \"%s\" \"C:\\test\"
它们也都相同,并且都被破坏了。 请注意,ѭ13不会消除创建字符串文字时发生的变形-它无法知道用户实际上并不需要在字符串中嵌入制表符。     ,如果使用
%s
格式,则
printfn
函数系列将打印字符串而不会转义 (“ 15”格式指定参数为字符串,应按原样打印):
> printfn \"%s\" \"C:\\\\Test\";;
C:\\Test
val it : unit = ()
如果您使用
%A
(表示参数是任何对象并且应使用F#语法打印-请注意,这适用于列表),则行为会有所不同。尽管即使这样似乎也无法逃脱ѭ19字符:
> printfn \"%A\" \"C:\\\\Test\";;
\"C:\\Test\"
val it : unit = ()
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...