说我有以下内容:
char* string = "Hello, how are you?";
是否可以只打印出该字符串的最后5个字节?那么前5个字节呢?是否有printf
的某些变体允许这样做?
答案 0 :(得分:109)
是否可以只打印出该字符串的最后5个字节?
是的,只需将指针传递给第五个到最后一个字符。您可以通过string + strlen(string) - 5
确定这一点。
前5个字节怎么样?
使用精确说明符:%.5s
#include <stdio.h>
#include <string.h>
char* string = "Hello, how are you?";
int main() {
/* print at most the first five characters (safe to use on short strings) */
printf("(%.5s)\n", string);
/* print last five characters (dangerous on short strings) */
printf("(%s)\n", string + strlen(string) - 5);
int n = 3;
/* print at most first three characters (safe) */
printf("(%.*s)\n", n, string);
/* print last three characters (dangerous on short strings) */
printf("(%s)\n", string + strlen(string) - n);
return 0;
}
答案 1 :(得分:21)
是的,该字符串的最后五个字节可以通过以下方式完成:
printf ("%s\n", &(string[strlen (string) - 5]));
前五项可以完成:
printf ("%.5s\n", string);
您可以将两者组合在一起以获取字符串中的子字符串。单词how
可以打印:
printf ("%.3s\n", &(string[strlen (string) + 7]));
你做必须要小心,字符串足够长,以便工作。打印单字符字符串的最后五个字符将导致未定义的行为,因为索引最终为-4
。换句话说,在尝试之前检查字符串长度。
答案 2 :(得分:0)
两种解决方案:
假设给出一个长度相同的可预测字符串 - 我将使用日期作为示例并要求分成HH:MM:SS.DDDDDDD
char hh[3] = {0};
char mm[3] = {0};
char ss[3] = {0};
char dec[8] = {0};
strncpy ( hh, date, 2 );
strncpy ( mm, date+2, 2 );
strncpy ( ss, date+4, 2 );
strncpy ( dec, date+6, 7 );
printf("%s:%s:%s.%s\n", hh, mm, ss, dec);
[1]可读实施:
printf("%.2s:%.2s:%.2s.%.7s\n", date, date+2, date+4, date+6);
[2]简短实施:
或者:
printf("%2.2s:%2.2s:%2.2s.%7.7s\n", date, date+2, date+4, date+6);
或:
23:59:59.1234567
应该工作。
而不是printf - 您可以使用sprintf并复制到缓冲区。我还会检查正确的长度以避免不可预测的行为。
在任何一种情况下 - 输出都是:
{
"@class": "com.example.ViewModel.Loading"
}