#include <iostream>
#include <string>
#include <cstdlib> // for strtol()
#include <cstdio> // for printf()
#define countof(array) (sizeof(array)/sizeof(array[0]))
int main()
{
std::string uHex;
long arrayValues[4];
for( int i = 0; i < countof(arrayValues); ++i )
{
std::cin >> uHex;
char* end;
arrayValues[i] = std::strtol(uHex.c_str(), &end, 16);
// At this point, we expect end to be pointing at the '\0'
// (the C-string nul terminator). If it's not, then we have
// invalid chars in our input, and arrayValues[i] is bogus.
if (*end != '\0')
{
std::cout << "Invalid characters: \"" << uHex << "\" (please try again)\n";
--i; // compensate for the ++i above to re-try this again
}
}
for( int i = 0; i < countof(arrayValues); ++i )
{
std::cout << i << " --> " << arrayValues[i] << " --> "
<< static_cast<char>(arrayValues[i]) << '\n';
// std::printf("%d --> %d --> %c\n", i, arrayValues[i], arrayValues[i]);
}
}
coutまたはprintf()を使用して、まったく同じ出力を両方の方法で出力していることに注意してください。個人的には、printf()が好きなのは、それが最初に学んだことではなく、printf()形式の出力は、coutを作成できるため、coutの方が柔軟性が高いにもかかわらず、coutよりもはるかに表現力があり(ほとんどの組み込み型の場合)、冗長性が低いためです。ユーザー定義型の出力関数。ただし、コンパイラがprintf()/ scanf()フォーマットパラメータタイプチェックを実行しない場合(GCCを有効にすると、GCCが実行します)、タイプが一致しない興味深い出力を簡単に作成し、非決定論的な優れた出力を作成できます。フォーマット文字列が示すよりも少ない引数を指定することにより、SEGVジェネレーターは非常に簡単になります。