出力する文字列の文字数を指定する方法はありますか(int
sの小数点以下の桁数に似ています)?
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
基本的な方法は次のとおりです。
_printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
_
他の、多くの場合、より便利な方法は次のとおりです。
_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);
_
printf()
のPOSIX仕様は、これらのメカニズムを定義しています。
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
%8sは、8文字の最小幅を指定します。 8で切り捨てたいので、%。8sを使用します。
常に正確に8文字を印刷する場合は、%8.8sを使用できます
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;
固定量の文字を指定することに加えて、*
これは、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'
C++では簡単です。
std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, ""));
編集:文字列イテレータでこれを使用する方が安全ですので、最後まで実行しないでください。短すぎるprintfとstringで何が起こるかはわかりませんが、これはより安全だと思います。
最初の4文字を印刷します。
printf("%.4s\n", "A string that is more than 8 chars");
詳細については このリンク を参照してください(.precision -sectionを確認してください)
printf(..... "%。8s")
C++では、次のように行います。
char *buffer = "My house is Nice";
string showMsgStr(buffer, buffer + 5);
std::cout << showMsgStr << std::endl;
2番目の引数を渡すと、文字列のサイズを超えてメモリアクセス違反が発生する可能性があるため、これは安全ではないことに注意してください。これを回避するには、独自のチェックを実装する必要があります。