说我有以下几点:
char* string = "Hello, how are you?";
是否可以仅打印该字符串的最后5个字节?仅前5个字节呢?是否有一些变化可以printf
做到这一点?
Answers:
是否可以仅打印该字符串的最后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;
}
printf
仍将在第一个空字符处停止。
是的,该字符串的最后五个字节可以用:
printf ("%s\n", &(string[strlen (string) - 5]));
前五个可以通过以下方式完成:
printf ("%.5s\n", string);
您也可以将两者结合起来以在字符串中获取子字符串。该词how
可以用以下命令打印:
printf ("%.3s\n", &(string[strlen (string) + 7]));
你千万要小心,字符串足够长,这个工作。打印一个字符的字符串的最后五个字符将导致未定义的行为,因为索引以结束-4
。换句话说,在尝试执行此操作之前,请检查字符串长度。
int x = 3; printf ("%.*s, x, "abcde")
。对于这两个数字,在这种情况下,这并不是真正必要的,因为您知道您有足够的字符,但是我仍然是出于习惯。对于字符串,实际上是最小和最大长度。我将其删除,因为这里多余。
%.*s
格式说明符,而不是%*s
格式说明符。
printf
仍将在第一个空字符处停止。
两种解决方案:
假设给出了具有相同长度的可替换字符串-我将以date为例,并要求将其拆分为HH:MM:SS.DDDDDDD
char date[14] = "2359591234567";
[1]可读的实现:
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);
[2]简短实施:
要么:
printf("%.2s:%.2s:%.2s.%.7s\n", date, date+2, date+4, date+6);
要么:
printf("%2.2s:%2.2s:%2.2s.%7.7s\n", date, date+2, date+4, date+6);
应该管用。
代替printf-您可以使用sprintf并复制到缓冲区。我还将检查正确的长度,以避免不可预测的行为。
无论哪种情况,输出都是:
23:59:59.1234567