是否可以只打印出C字符串的某个部分,而不需要创建单独的子字符串?

时间:2011-10-15 21:40:21

标签: c printf c-strings

说我有以下内容:

char* string = "Hello, how are you?";

是否可以只打印出该字符串的最后5个字节?那么前5个字节呢?是否有printf的某些变体允许这样做?

3 个答案:

答案 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" 
}