私が a を持っていてchar* str = "0123456789"
、最初と最後の 3 文字を切り取り、真ん中だけを印刷したいとしましょう。最も簡単で安全な方法は何ですか?
ここでのトリック: カットする部分と印刷する部分は可変サイズであるため、非常に長い char* または非常に小さい char* を持つことができます。
私が a を持っていて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
、メモリが不要になったときに呼び出し元が'dすることができます。Cの精神では、関数は提供された開始位置と長さを検証しません。
特定の数の文字のみを印刷する printf で実行できる魔法があると思いますが、それは一般的に理解されておらず、使用されていません。以前の仕事でそれをやろうとしましたが、一貫して機能させることができませんでした。
私がすることは、文字を保存し、文字列内のその文字をnullにして、印刷してから保存することです。