Cでchar []の一部を印刷する最も簡単な方法
-
05-07-2019 - |
質問
char * str =" 0123456789"
があり、最初と最後の3文字を切り取り、真ん中、最も簡単で安全な方法を印刷したいとしますそれをするのですか?
今のトリック:カットする部分と印刷する部分は可変サイズなので、非常に長いchar *または非常に小さいchar *を持つことができます。
解決
printf()
と特別なフォーマット文字列を使用できます:
char *str = "0123456789";
printf("%.6s\n", str + 1);
%s
変換指定子の精度は、印刷する最大文字数を指定します。変数を使用して、実行時の精度も指定できます。
int length = 6;
char *str = "0123456789";
printf("%.*s\n", length, str + 1);
この例では、次の引数( length
)に%s
変換の精度が含まれることを示すために*が使用されます。対応する引数は int
。
ポインター演算を使用して、上記のように開始位置を指定できます。
[編集]
もう1つ、文字列が精度指定子より短い場合、印刷される文字は少なくなります。例:
int length = 10;
char *str = "0123456789";
printf("%.*s\n", length, str + 5);
" 56789
"を印刷します。常に特定の数の文字を印刷する場合は、最小フィールド幅と精度の両方を指定します。
printf("%10.10s\n", str + 5);
または
printf("%*.*s\n", length, length, str + 5);
これは印刷されます:
" 56789"
マイナス記号を使用して、フィールドの出力を左揃えにできます。
printf("%-10.10s\n", str + 5);
最後に、最小フィールド幅と精度は異なる場合があります。つまり、
printf("%8.5s\n", str);
8文字のフィールドで右揃えで最大5文字を印刷します。
他のヒント
ロバート・ギャンブルとスティーブはほとんど別々に作品を持っています。 全体に組み立てる:
void print_substring(const char *str, int skip, int tail)
{
int len = strlen(str);
assert(skip >= 0);
assert(tail >= 0 && tail < len);
assert(len > skip + tail);
printf("%.*s", len - skip - tail, str + skip);
}
例の呼び出し:
print_substring("0123456789", 1, 3);
データの変更を気にしない場合は、ポインタ演算を行うだけで済みます。これは、strが配列ではなくcharポインターであることを前提としています:
char string[] = "0123456789";
char *str = string;
str += 3; // "removes" the first 3 items
str[4] = '\0'; // sets the 5th item to NULL, effectively truncating the string
printf(str); // prints "3456"
これは、個人用ライブラリから見つけた便利で便利なサブストリング関数です。
char *
substr(const char *src, size_t start, size_t len)
{
char *dest = malloc(len+1);
if (dest) {
memcpy(dest, src+start, len);
dest[len] = '\0';
}
return dest;
}
おそらく一目瞭然ですが、文字列、開始位置(ゼロから始まる)、および長さを取り、mallocが失敗した場合は元の文字列のサブストリングまたはNULLポインターを返します。返されたポインターは、メモリが不要になったときに呼び出し元によって free
されます。 Cの精神では、関数は指定された開始位置と長さを検証しません。
特定の数の文字のみを印刷するprintfで実行できる魔法があると思いますが、一般的には理解も使用もされていません。前の仕事でやろうとしましたが、一貫して動作させることができませんでした。
私がやろうとしているのは、文字を保存し、文字列内のその文字をnullにして、印刷してから保存することです。