这段代码是如何工作的?
Posted
技术标签:
【中文标题】这段代码是如何工作的?【英文标题】:how it works this code? 【发布时间】:2018-08-10 08:17:32 【问题描述】:我不明白这个功能。有人可以向我解释完整的代码吗? *(pass+i) = temp_passP[i];
的这条线是什么?
还有printf \a printf \b
是什么意思?
void get_password(char* pass)
char temp_passP[25];
int i=0;
while(1)
temp_passP[i]=getch();
if(temp_passP[i]==13)break;
else if(temp_passP[i]==8)
if(i!=0)
printf("\b \b");
i--;
else printf("\a");
else
printf("*");
*(pass+i) = temp_passP[i];
i++;
*(pass+i)='\0'; what it means ?
【问题讨论】:
【参考方案1】:*(pass+i)
等价于pass[i]
。你必须了解指针。 '\b'
表示退格,它将光标向左移动。 '\a'
表示警报,它会发出哔声或铃声。
8 等于'\b'
。 temp_passP[i]==8
表示“当用户按下退格键时”。它将光标向左移动,打印空格,由于光标向右移动,它再次向左移动光标。
当用户按下其他键时,它会打印'*'
并将输入复制到pass[i]
。
简而言之,这个程序会获取输入,直到用户按下回车键并将其复制到pass
。
【讨论】:
【参考方案2】:首先要了解这个功能,它不是很好。 char temp_passP[25]
应该只是int ch
,那么所有对char temp_passP[i]
的引用都可以是ch
。通过这种更改,可能更容易看到代码只是通过 getch() 从标准输入读取字符,一次一个字符,并检查每个字符。
首先,它将字符与回车的 ASCII 码 13 进行比较。在某些系统上,当用户键入 ENTER 时,系统会将回车和换行这两个字符放入标准输入流中。所以这个检查正在寻找结束线。 (在其他环境中,ENTER 只生成换行符(ASCII 10),因此该代码在那里不起作用。)
然后该函数将该字符与 8 进行比较,8 是 Backspace 的 ASCII 码。该代码正在检查用户是否正在删除输入的最后一个字符。如果是这样,它会将指针备份到pass
缓冲区中,并打印"\b \b"
序列,该序列会从屏幕上删除该字符的星号。如果pass
缓冲区中没有字符,或者是因为尚未输入任何字符,或者因为已使用退格键删除了所有字符,则"\a"
旨在让铃声响起。
如果字符没有什么特别之处,则将其与*(pass+i) = temp_passP[i];
(或*(pass+i) = ch;
)一起写入pass
缓冲区。
*(pass+i) = '\0';
命令确保pass
缓冲区在最后一个未被删除的字符之后始终为空终止。
【讨论】:
不错的答案,但是 getch 是 Windows 功能,所以这段代码没有考虑其他平台。以上是关于这段代码是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章