80

私は次のものを持っているとしましょう:

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

この文字列の最後の 5 バイトだけを印刷することは可能ですか? 最初の 5 バイトだけはどうでしょうか。printfこれを可能にするバリエーションはありますか?

4

3 に答える 3

144

この文字列の最後の 5 バイトだけを印刷することは可能ですか?

はい、最後から 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;
}
于 2011-10-15T21:43:51.750 に答える
22

はい、その文字列の最後の 5 バイトは次のように実行できます。

printf ("%s\n", &(string[strlen (string) - 5]));

最初の 5 つは、次の方法で実行できます。

printf ("%.5s\n", string);

2 つを組み合わせて、文字列内の部分文字列を取得することもできます。単語は次のhowように印刷できます。

printf ("%.3s\n", &(string[strlen (string) + 7]));

これが機能するには、文字列が十分に長いことに注意する必要があります。1 文字の文字列の最後の 5 文字を出力すると、インデックスが で終了するため、未定義の動作が発生し-4ます。つまり、これを試みる前に文字列の長さを確認してください。

于 2011-10-15T21:45:15.283 に答える
-1

2 つのソリューション:

同じ長さの予測可能な文字列が与えられたとします。例として日付を使用し、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
于 2018-05-24T17:27:25.877 に答える