I'm guessing you want a Windows version. Since I already wrote one on these forums but with some errors in checking if the HANDLEs are valid or not, I'll put a corrected one here:
Code:
char *getPass(char *szBuffer, size_t len)
{
size_t i;
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD dwOld, dwNumRead, dwNumWritten;
if((hIn != INVALID_HANDLE_VALUE) && (hOut != INVALID_HANDLE_VALUE))
{
if(GetConsoleMode(hIn,&dwOld))
{
if(SetConsoleMode(hIn,ENABLE_PROCESSED_INPUT))
{
for(i=0;i<len-1;i++)
{
if(ReadConsole(hIn,&szBuffer[i],1,&dwNumRead,NULL))
{
if(szBuffer[i] == '\r')
{
break;
}
else WriteConsole(hOut,"*",1,&dwNumWritten,NULL);
}
else break;
}
WriteConsole(hOut,"\n",1,&dwNumWritten,NULL);
szBuffer[i] = '\0';
SetConsoleMode(hIn,dwOld);
return szBuffer;
}
}
}
return NULL;
}
There's a *nix version floating around somewhere in the same topic. I think it was in the C++ section.
If you want nothing or spaces instead of *'s, you can alter this function to do that, too.
Edit: Fixed an important bug where the '\0' wouldn't be properly put in place in some cases.....