次のようなものがあるとしましょう:
char* string = "Hello, how are you?";
この文字列の最後の5バイトのみを印刷することは可能ですか?最初の5バイトのみはどうですか?これを可能にするprintf
のバリエーションはありますか?
この文字列の最後の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;
}
はい、その文字列の最後の5バイトは次の方法で実行できます。
printf ("%s\n", &(string[strlen (string) - 5]));
最初の5つは、次の方法で実行できます。
printf ("%.5s\n", string);
2つを組み合わせて、文字列内の部分文字列を取得することもできます。 Word how
は次のように印刷できます。
printf ("%.3s\n", &(string[strlen (string) + 7]));
do文字列がこれが機能するのに十分な長さであることに注意する必要があります。 1文字の文字列の最後の5文字を印刷すると、インデックスが-4
。つまり、これを試みる前に文字列の長さを確認してください。
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