此代码如何工作?

时间:2018-08-10 08:17:32

标签: c dev-c++

我不了解此功能。有人可以向我解释完整的代码吗?这行*(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 ?
         }
    }

2 个答案:

答案 0 :(得分:3)

*(pass+i)等效于pass[i]。您必须了解指针。 '\b'表示退格键,它将光标向左移动。 '\a'表示机敏,发出哔哔声或铃声。

8等于'\b'temp_passP[i]==8的意思是“用户按下退格键时”。它将光标向左移动,打印空间,并且由于光标向右移动,因此再次将光标向左移动。

当用户按下其他键时,它将打印'*'并将输入复制到pass[i]

简而言之,该程序将获得输入,直到用户按下Enter键并将其复制到pass中为止。

答案 1 :(得分:1)

关于此功能的第一件事是,它不是很好。 char temp_passP[25]应该只是int ch,然后对char temp_passP[i]的所有引用都可以是ch。有了这一更改,可能更容易看到代码只是通过getch()从stdin中读取字符,一次读取一个字符,然后检查每个字符。

首先,它将字符与13相比较,这是回车的ASCII码。在某些系统上,当用户键入ENTER时,系统会将两个字符回车符和换行符放到stdin流中。因此,此检查正在寻找终点线。 (在其他环境中,ENTER仅生成换行符(ASCII 10),因此该代码在那里不起作用。)

然后该函数将字符与8进行比较,这是Backspace的ASCII码。该代码正在检查用户是否要删除最后输入的字符。如果是这样,它将备份指针到pass缓冲区中,并打印"\b \b"序列,该序列从屏幕上删除该字符的星号。如果pass缓冲区中没有字符,或者是因为尚未输入任何字符,或者是所有字符都已用Backspace删除了,则"\a"的作用是使铃声响起。

如果字符没什么特别的,则将其与pass(或*(pass+i) = temp_passP[i];)一起写入*(pass+i) = ch;缓冲区。

*(pass+i) = '\0';命令确保pass缓冲区始终是空终止的,直到最后一个未被删除的字符。