回答:
基本的な方法は次のとおりです。
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()
は、これらのメカニズムを定義しています。
-
指定された長さになるように、出力には空白が埋め込まれます(を追加しない限り、左側に)。
固定長の文字を指定することに加えて*
、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'
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;
ostream_iterator<char>(cout)
!代わりに、ostreambuf_iterator<char>(cout)
!パフォーマンスの違いはかなり大きいはずです。
std::cout.write(s.data(), 8)
。あるいは現代のC ++で、std::cout << std::string_view{s.data(), 8}
。
C ++では簡単です。
std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, ""));
編集:これを文字列イテレータで使用することも安全であるため、最後から実行しないでください。短すぎるprintfとstringで何が起こるかはわかりませんが、これがより安全であると思います。
std::cout << someStr.substr(0,8);
はるかに明白です。