假设我有以下内容:
char *string = "Hello, how are you?";
是否可以仅打印该字符串的最后 5 个字节?仅前 5 个字节怎么样?是否有一些
printf
的变体可以实现这一点?
是否可以仅打印该字符串的最后 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 ("%s\n", &(string[strlen (string) - 5]));
前五个可以通过以下方式完成:
printf ("%.5s\n", string);
您也可以将两者结合起来获取字符串中的子字符串。单词
how
可以打印为:
printf ("%.3s\n", &(string[strlen (string) + 7]));
你do必须小心,字符串足够长才能正常工作。打印单字符字符串的最后五个字符将导致未定义的行为,因为索引以
-4
结束。换句话说,在尝试此操作之前请检查字符串长度。
如 Rob 的最佳答案,但我会将其放入 foo()
#include <stdio.h>
#include <string.h>
void printsl(const char* s, int i, int k) { // print-slice s[i:k] of c-string as in python
char buff[20]; // set a ridiculous lot of space in case string s is very, very long...
if (k == -1)
k = strlen(s);
sprintf(buff, "%%.%ds", k-i);
printf(buff, s+i);
}
// too complicated?
void printslb(const char* s, int i, int k) { // print-slice s[i:k] of c-string as in python : more basic (?)
if (k == -1)
k = strlen(s);
for (int j=i; j<k; ++j)
putchar(s[j]);
}
int main() {
// use k=-1 to indicate the end, whatever it is, but printf() is better there.
const char* s = "abcde_ghijk_mno";
printsl(s, 0, -1); printf("\n"); // same as: printf(s);
printsl(s, 4, -1); printf("\n"); // same as: printf(s+4);
printsl(s, 0, 4); printf("\n"); // useful case
printsl(s, 4, 8); printf("\n"); // useful case
printslb(s, 0, -1); printf("\n");
printslb(s, 4, -1); printf("\n");
printslb(s, 0, 4); printf("\n");
printslb(s, 4, 8); printf("\n");
return 0;
}
两种解决方案:
假设给定一个具有相同长度的可谓字符串 - 我将使用日期作为示例,并要求拆分为 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