这段代码是如何工作的?

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 功能,所以这段代码没有考虑其他平台。

以上是关于这段代码是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

这段代码是如何工作的?

谁能解释这段代码是如何工作的?

在 Scala 中计算素数:这段代码是如何工作的?

这段混淆的 Haskell 代码是如何工作的?

这段代码中的“继续”是如何工作的?

这段代码是如何工作的?具体来说,WorkerCompare 结构 [关闭]