printf()を使用して印刷する文字列の文字数を指定する方法はありますか?


127

印刷する文字列の文字数を指定する方法はありますか(intsの小数点以下と同様)?

printf ("Here are the first 8 chars: %s\n", "A string that is more than 8 chars");

印刷したい: Here are the first 8 chars: A string

回答:


226

基本的な方法は次のとおりです。

printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

もう1つの方法は、多くの場合より便利です。

printf ("Here are the first %d chars: %.*s\n", 8, 8, "A string that is more than 8 chars");

ここでは、printf()のint引数として長さを指定します。これは、フォーマット内の「*」を引数から長さを取得する要求として扱います。

次の表記も使用できます。

printf ("Here are the first 8 chars: %*.*s\n",
        8, 8, "A string that is more than 8 chars");

これも "%8.8s"表記に似ていますが、実行時に最小長と最大長を指定できます。次のようなシナリオではより現実的です。

printf("Data: %*.*s Other info: %d\n", minlen, maxlen, string, info);

のPOSIX仕様でprintf()は、これらのメカニズムを定義しています。


2
最後の例へ:コピーされた文字列がminlenより短い場合はどうなりますか?
Truthseeker 2013年

4
-指定された長さになるように、出力には空白が埋め込まれます(を追加しない限り、左側に)。
ジョナサンレフラー2013年

13
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

%8sは、8文字の最小幅を指定します。8で切り捨てたいので、%。8sを使用します。

常に正確に8文字を印刷する場合は、%8.8sを使用できます


13

固定長の文字を指定することに加えて*、printfが引数から文字数を取得することを意味するを使用することもできます。

#include <stdio.h>

int main(int argc, char *argv[])
{
        const char hello[] = "Hello world";
        printf("message: '%.3s'\n", hello);
        printf("message: '%.*s'\n", 3, hello);
        printf("message: '%.*s'\n", 5, hello);
        return 0;
}

プリント:

message: 'Hel'
message: 'Hel'
message: 'Hello'

11

printfあなたを使用して行うことができます

printf("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");

C ++を使用している場合は、STLを使用して同じ結果を得ることができます。

using namespace std; // for clarity
string s("A string that is more than 8 chars");
cout << "Here are the first 8 chars: ";
copy(s.begin(), s.begin() + 8, ostream_iterator<char>(cout));
cout << endl;

または、あまり効率的ではありません:

cout << "Here are the first 8 chars: " <<
        string(s.begin(), s.begin() + 8) << endl;

1
注:使用しないでくださいostream_iterator<char>(cout)!代わりに、ostreambuf_iterator<char>(cout)!パフォーマンスの違いはかなり大きいはずです。
DietmarKühl2017

代わりに使用する方が効率的ですstd::cout.write(s.data(), 8)。あるいは現代のC ++で、std::cout << std::string_view{s.data(), 8}
Artyer

4

最初の4文字を印刷します。

printf("%.4s\n", "A string that is more than 8 chars");

詳細については、このリンクを参照してください(.precision -sectionを確認してください)


4

C ++では簡単です。

std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, ""));

編集:これを文字列イテレータで使用することも安全であるため、最後から実行しないでください。短すぎるprintfとstringで何が起こるかはわかりませんが、これがより安全であると思います。


32
ええ、そう、それは「簡単」です。C ++は常に自動車事故のように見えます。
James K. Polk大統領

あなたはまだc ++でprintf()を行うことができます:)
StasM

6
これは皮肉だったと思います。std::cout << someStr.substr(0,8);はるかに明白です。
MSalters 2010

2
@MSalters回答として投稿してください。
Jonathan Mee


1

C ++では、次のようにします。

char *buffer = "My house is nice";
string showMsgStr(buffer, buffer + 5);
std::cout << showMsgStr << std::endl;

2番目の引数を渡すと、文字列のサイズを超えてメモリアクセス違反が発生する可能性があるため、これは安全ではないことに注意してください。これを回避するには、独自のチェックを実装する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.