html中%3c%%%3e,CSS中的内联SVG

a836fe9914ad7082426221926ff52550.png

达令说

对于仍在苦苦挣扎的人来说,我设法让所有现代浏览器IE11及以上版本都能正常运行。base64对我来说没有选择,因为我想使用SASS根据任何给定的颜色生成SVG图标。例如:@include svg_icon(heart, #FF0000);这样我就可以用任何颜色创建一个特定的图标,只需要在CSS中嵌入一次SVG形状。(使用base64,你必须在你想要使用的每种颜色中嵌入SVG)您需要注意三件事:URL包含您的SVG 正如其他人所建议的那样,您需要对整个SVG字符串进行URL编码,以使其在IE11中工作。在我的情况下,我在诸如fill="#00FF00"和之类的字段中省略了颜色值,stroke="#FF0000"并用SASS变量替换它们,fill="#{$color-rgb}"因此可以用我想要的颜色替换它们。您可以使用任何在线转换器对字符串的其余部分进行URL编码。你最终得到一个像这样的SVG字符串:%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%20494.572%20494.572%27%20width%3D%27512%27%20height%3D %27512%27%3E%0A%20%20%3Cpath%20D%3D%27M257.063%200C127.136%200%2021.808%20105.33%2021.808%20235.266c0%2041.012 2010.535%%2079.541 2028.973%%20113.104L3.825 %20464.586c345%2012.797%2041.813%2012.797%2015.467%200%2029.872-4.721%2041.813-12.797v158.184z%27%20fill%3D%27#{$ color-rgb}%27%2F%3E%3C%2Fsvg% 3E在数据URL中使用UTF8 CHARSET在创建数据URL时,您需要省略其在IE11中工作的字符集。NOT background-image:url(data:image / svg + xml; utf-8,%3Csvg%2 ....)但是 background-image:url(数据:image / svg + xml,%3Csvg%2 ... 。)使用RGB()INSTEAD OF HEX颜色 Firefox不喜欢SVG代码中的#。因此,您需要将RGB颜色十六进制值替换为RGB值。NOT fill =“#FF0000” 但是填充=“rgb(255,0,0)”在我的例子中,我使用SASS将给定的十六进制转换为有效的rgb值。正如评论中指出的那样,最好对您的RGB字符串进行URL编码(因此逗号变为%2C)@mixin svg_icon($id, $color) {   $color-rgb: "rgb(" + red($color) + "%2C" + green($color) + "%2C" + blue($color) + ")";   @if $id == heart {      background-image: url('data:image/svg+xml,%3Csvg%20xmlns%3D%27https%3A%2F%2F2.zoppoz.workers.dev%3A443%2Fhttp%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%20494.572%20494.572%27%20width%3D%27512%27%20height%3D%27512%27%3E%0A%20%20%3Cpath%20d%3D%27M257.063%200C127.136%200%2021.808%20105.33%2021.808%20235.266c0%204%27%20fill%3D%27#{$color-rgb}%27%2F%3E%3C%2Fsvg%3E');   }}我意识到这对于非常复杂的SVG来说可能不是最好的解决方案(内联SVG从来就不是这种情况),但对于只有几种颜色的平面图标,这真的很棒。我能够省略一个完整的精灵位图,并在我的CSS中用内联SVG替换它,压缩后结果只有25kb左右。因此,这是限制网站必须执行的请求数量的好方法,而不会使CSS文件膨胀。

<think>好的,我现在要回答用户关于C语言中%p格式说明符的问题。用户之前已经询问过C++数组下标的相关内容,现在转向C语言的基础知识,特别是printf函数中的%p。我需要确保回答准确且易于理解。 首先,我需要回忆%p的作用。%p在C语言中用于输出指针的地址,也就是以十六进制格式显示指针的值。比如,当使用printf("%p", &var)时,会输出变量var的内存地址。 接下来,用户可能想知道%p的具体用法和注意事项。比如,是否需要强制转换指针类型,不同平台下的输出差异,以及和%x、%lx等格式的区别。此外,用户可能也关心%p的输出格式,例如是否带有前缀如0x。 我需要组织回答的结构,可能分为定义、用法示例、注意事项、与其他格式符的区别等部分。同时,要使用简单的中文,避免技术术语过多,必要时举例说明。 还要注意用户可能的误区,比如在传递非指针变量时使用%p会导致未定义行为,或者不同编译器对%p的处理方式是否一致。此外,提到C标准中对%p的规定,增强回答的权威性。 最后,总结%p的用途,并建议在调试时如何使用它来查看内存地址,同时提醒安全性和可移植性的问题。可能还需要对比C++中的类似用法,但用户的问题集中在C语言,所以主要围绕C来展开。 现在需要检查是否存在错误或遗漏。比如,%p是否总是输出十六进制,是否包含前缀,如何处理空指针等。此外,是否需要提及使用%p时应该将指针转换为void*类型,因为在C中不同类型的指针可能需要强制转换,否则可能会有警告。 例如,当打印int*指针时,应该使用printf("%p", (void*)p); 以避免潜在的问题。这一点很重要,可能用户在使用时遇到警告,需要解释原因。 总结,回答应包括以下几点: 1. %p的定义和用途 2. 示例代码 3. 注意事项,如强制转换指针为void* 4. 输出格式说明 5. 与其他格式符的区别 6. 常见错误和未定义行为 7. 实际应用场景 确保内容准确,结构清晰,符合用户需求。</think>在C语言中,`%p` 是 `printf` 函数中用于格式化输出指针(即内存地址)的格式说明符。以下是详细说明: --- ### 1. **基本定义** - **用途**:`%p` 用于输出指针变量指向的内存地址。 - **输出格式**:通常以**十六进制**表示,并可能带有前缀(如 `0x`),具体格式依赖编译器和系统。 - **语法**:`printf("地址:%p", pointer);` --- ### 2. **示例代码** ```c int num = 10; int *ptr = &num; // ptr指向num的地址 printf("变量num的地址:%p\n", (void*)&num); printf("指针ptr存储的地址:%p\n", (void*)ptr); ``` 输出示例(具体值因系统而异): ``` 变量num的地址:0x7ffd4d3e5b8c 指针ptr存储的地址:0x7ffd4d3e5b8c ``` --- ### 3. **注意事项** 1. **强制转换为 `void*`** C标准要求 `%p` 对应的参数应为 `void*` 类型。若传递其他类型指针(如 `int*`),建议显式转换: ```c printf("%p", (void*)&num); // 正确写法 ``` 否则可能引发编译器警告或未定义行为。 2. **空指针的输出** 空指针(`NULL`)通常输出为 `(nil)`(Linux/GCC)或 `0x0`(某些系统)。 3. **跨平台差异** 地址的十六进制位数和前缀可能因系统位数(32位/64位)不同而变化(如 `0x7fff...` 或 `00000000FFFF1111`)。 --- ### 4. **与其他格式符的区别** | 格式符 | 用途 | 示例输入 | 输出示例 | |--------|--------------------|------------------|----------------| | `%p` | 输出指针地址 | `&num` | `0x7ff...` | | `%x` | 输出十六进制整数 | `0xdeadbeef` | `deadbeef` | | `%lx` | 输出长整型十六进制 | `0x12345678abcd` | `12345678abcd` | - **关键区别**:`%x` 用于整数,而 `%p` 专用于指针地址(自动适配系统位数)。 --- ### 5. **常见错误** - **未转换指针类型** ```c printf("%p", &num); // 警告:建议转为void* ``` - **输出非指针值** ```c printf("%p", num); // 错误!num不是指针,导致未定义行为 ``` --- ### 6. **实际应用** - **调试内存问题**:查看变量、数组、结构体的地址分布。 - **验证指针有效性**:检查指针是否为 `NULL` 或异常值。 --- ### 总结 - `%p` 是C语言中输出指针地址的标准方式。 - 始终将指针强制转换为 `void*` 再使用 `%p`。 - 输出格式因系统和编译器而异,但均为十六进制。 - 避免用 `%x` 替代 `%p`,否则可能截断地址或引发错误。 若需进一步探讨指针运算或动态内存管理,请随时提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值