32

私が a を持っていてchar* str = "0123456789"、最初と最後の 3 文字を切り取り、真ん中だけを印刷したいとしましょう。最も簡単で安全な方法は何ですか?

ここでのトリック: カットする部分と印刷する部分は可変サイズであるため、非常に長い char* または非常に小さい char* を持つことができます。

4

5 に答える 5

64

printf()、および特別なフォーマット文字列を使用できます。

char *str = "0123456789";
printf("%.6s\n", str + 1);

変換指定子の精度は、%s印刷する最大文字数を指定します。実行時に変数を使用して精度を指定することもできます。

int length = 6;
char *str = "0123456789";    
printf("%.*s\n", length, str + 1);

この例では、次の引数 ( ) に変換lengthの精度が含まれることを示すために * が使用されています。対応する引数は.%sint

上で行ったように、ポインター演算を使用して開始位置を指定できます。

[編集]

もう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 文字を右寄せで印刷します。

于 2008-11-01T23:03:22.147 に答える
9

ロバート・ギャンブルとスティーブは別々にほとんどのピースを持っています. 全体に組み立て:

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);
于 2008-11-01T23:16:15.913 に答える
1

データを変更してもかまわない場合は、ポインタ演算を実行できます。これは、 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"
于 2008-11-01T23:03:41.197 に答える
0

これが私が個人的なライブラリから掘り出したクリーンでシンプルなサブストリング関数で、役に立つかもしれません:

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の精神では、関数は提供された開始位置と長さを検証しません。

于 2008-11-03T01:32:49.817 に答える
-2

特定の数の文字のみを印刷する printf で実行できる魔法があると思いますが、それは一般的に理解されておらず、使用されていません。以前の仕事でそれをやろうとしましたが、一貫して機能させることができませんでした。

私がすることは、文字を保存し、文字列内のその文字をnullにして、印刷してから保存することです。

于 2008-11-01T23:05:12.177 に答える