是否可以仅打印C字符串的特定部分,而无需创建单独的子字符串?


72

说我有以下几点:

是否可以仅打印该字符串的最后5个字节?仅前5个字节呢?是否有一些变化可以printf做到这一点?

Answers:


126

是否可以仅打印该字符串的最后5个字节?

是的,只需将指针传递到倒数第二个字符即可。您可以通过确定string + strlen(string) - 5

仅前5个字节呢?

使用精度说明符: %.5s


@Tim-不客气。不要忘记赞扬所有有用的答案,并接受可以解决您的问题的答案。(请注意另
一篇

更新了示例程序,以解决其他答案中@Tim的评论。
罗伯(Robᵩ)2011年

1
请注意,它printf仍将在第一个空字符处停止。
Flimm

惊人的答案。我知道可以做很多事,但这仍然让我感到惊讶。非常感谢你。
安东·克鲁格'18

21

是的,该字符串的最后五个字节可以用:

前五个可以通过以下方式完成:

您也可以将两者结合起来以在字符串中获取子字符串。该词how可以用以下命令打印:

千万要小心,字符串足够长,这个工作。打印一个字符的字符串的最后五个字符将导致未定义的行为,因为索引以结束-4。换句话说,在尝试执行此操作之前,请检查字符串长度。


2
谢谢,非常有信息。如果您在编译时不知道n是什么,是否可以打印出字符串的前n个字节?说n是一个整数,我可以只用printf(“%ns”,string); ?另外,为什么它是“ 5.5”而不是“ printf(“%5.5s \ n”,字符串)中的“ 5”;“ (类似地,另一个3.3)?
蒂姆(Tim)

5
蒂姆:是的。查看%* s格式说明符。基本上,您在字符串之前提供一个int,它指定字符串的宽度。
约尔根·西格瓦德森(JörgenSigvardsson)2011年

1
@Tim:是的,Jörgen已经说过如何使用int x = 3; printf ("%.*s, x, "abcde")。对于这两个数字,在这种情况下,这并不是真正必要的,因为您知道您有足够的字符,但是我仍然是出于习惯。对于字符串,实际上是最小和最大长度。我将其删除,因为这里多余。
paxdiablo

1
@JörgenSigvardsson:我认为您是指%.*s格式说明符,而不是%*s格式说明符。
Flimm

请注意,它printf仍将在第一个空字符处停止。
Flimm

-1

两种解决方案:

假设给出了具有相同长度的可替换字符串-我将以date为例,并要求将其拆分为HH:MM:SS.DDDDDDD

[1]可读的实现:

[2]简短实施:

要么:

要么:

应该管用。

代替printf-您可以使用sprintf并复制到缓冲区。我还将检查正确的长度,以避免不可预测的行为。

无论哪种情况,输出都是:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.