Вы находитесь на странице: 1из 10

, .

.
:
: 01.02.2012
printf. ,
printf . ,
. - .
, printf. , , , -
. , ,
.
. , . , printf. ,
,
. ! , .
.
: .

:
printf(name);
. , ,
.
, .
. . ,
. , . ,
, , .
, , .
,
, . ,
. ,
.

" " . ,
. , Visual Studio 2010. -,
/GL (Whole Program Optimization). ,
__declspec(noinline).
.
. , . , .

,
.


Visual Studio 2010 .
const size_t MAX_NAME_LEN = 60;
enum ErrorStatus {
E_ToShortName, E_ToShortPass, E_BigName, E_OK
};

void PrintNormalizedName(const char *raw_name)


{
char name[MAX_NAME_LEN + 1];
strcpy(name, raw_name);

for (size_t i = 0; name[i] != '\0'; ++i)


name[i] = tolower(name[i]);
name[0] = toupper(name[0]);

printf(name);
}

ErrorStatus IsCorrectPassword(
const char *universalPassword,
BOOL &retIsOkPass)
{
string name, password;
printf("Name: "); cin >> name;
printf("Password: "); cin >> password;
if (name.length() < 1) return E_ToShortName;
if (name.length() > MAX_NAME_LEN) return E_BigName;

if (password.length() < 1) return E_ToShortPass;

retIsOkPass =
universalPassword != NULL &&
strcmp(password.c_str(), universalPassword) == 0;
if (!retIsOkPass)
retIsOkPass = name[0] == password[0];

printf("Hello, ");
PrintNormalizedName(name.c_str());

return E_OK;
}

int _tmain(int, char *[])


{
_set_printf_count_output(1);
char universal[] = "_Universal_Pass_!";
BOOL isOkPassword = FALSE;
ErrorStatus status =
IsCorrectPassword(universal, isOkPassword);
if (status == E_OK && isOkPassword)
printf("\nPassword: OK\n");
else
printf("\nPassword: ERROR\n");
return 0;
}
_tmain() IsCorrectPassword().
"_Universal_Pass_!", "Password: OK".
, .

IsCorrectPassword() .
, .
, .
, ,
. PrintNormalizedName().
PrintNormalizedName() . ,
"printf(name);". , .
, .
PrintNormalizedName()? , ,
. , "andREy2008",
"Andrey2008".


. , -
. , printf(). - ,
. , ?
. printf()
. . .
printf() , .
. "%d%s", ,
int . printf() ,
, ,
. , access violation
. , .
, , printf():

1. .

"printf(name);" ,
. , "%d", ,
PrintNormalizedName(). :
Name: %d
Password: 1
Hello, 37
Password: ERROR
. ,
char name[MAX_NAME_LEN + 1];,
. , , - .
,
, - . ,
.

, : "%s". "%x%s". "%x%x%s" .


- , .
, , 4 .
, , . 60 ,
. "%f",
double. , 8
.
- :
%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%x(%s)
:

2. . .

:
Name: Aaa
Password: _Universal_Pass_!
Hello, Aaa
Password: OK

! ,
. , ,
. .


.
, ,
, . -,
, , .
- , printf()
, . ,
:

printf("%s", name);


, printf() ? , ,
. "%n".
, printf().
, , "%n"
. Visual Studio 2005 "%n"
. .
:
_set_printf_count_output(1);

, "%n":
int i;
printf("12345%n6789\n", &i);
printf( "i = %d\n", i );

:
123456789
i=5

, , .
, .
, . -, 4
( int). , printf()
. , "%00u".
.
.
. isOkPassword ,
0. IsCorrectPassword(), ,
- . , .
, .
, IsCorrectPassword:
%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f%f %n

"%n" ,
, "%f". , "%n" ,
isOkPassword 1.
:

3. . .

? . .
,
.

, , 'xF8', 'x32', 'x01',


'x7F'. , ,
0x7F0132F8. "%n". "%x" ,
0x7F0132F8
. , .


, . ,
"%n" .
, .
, , , .
, , :
printf("%s", name);


. ,
. .
, printf(name).
. ,
, . ,
. , printf() . ,
, , .
, ,
. , ,
. , , .

. , sprintf_s sprintf .
- . -
. std::string. ,
boost::format std::stringstream.

P.S. -, , - " ". .


, printf() ?
. , . ,
.

Вам также может понравиться