我需要更改什么才能使此C程序在Linux上运行?

时间:2015-07-17 09:25:57

标签: c linux getch conio

我需要让这个工作Linux,我知道conio.h不适用于Linux,主要问题是getch()函数。我尝试使用另一个像curses.h这样的lib,但我仍然遇到了很多错误。 它需要用户输入密码并出于安全原因将其转换为****。

旧代码:

#include<stdio.h>
#include<conio.h>

void main()
{
    char password[25],ch;
    int i;

    clrscr();
    puts("Enter password: ");

    while(1)
    {
        if(i<0)
            i=0;
        ch=getch();

        if(ch==13)
            break;

        if(ch==8)
        {
            putch('b');
            putch(NULL);
            putch('b');
            i--;
            continue;
        }

        password[i++]=ch;
        ch='*';
        putch(ch);
    }

    password[i]='';
    printf("\nPassword enterd : %s",password);
    getch();
}

根据@ SouravGhosh的回答更新了代码:

#include<stdio.h>

int main(void)
{
    char password[25],ch;
    int i;

    //system("clear");
    puts("Enter password: ");

    while(1)
    {
        if(i<0)
            i=0;
        ch=getchar();

        if(ch==13)
            break;

        if(ch==8)
        {
            putchar('b');
            putchar('b');
            i--;
            continue;
        }

        password[i++]=ch;
        ch='*';
        putchar(ch);
    }

    password[i]=' ';
    printf("\nPassword enterd : %s",password);
    getchar();
    return 0;
}

3 个答案:

答案 0 :(得分:3)

使用

启动的一些指示
  1. 删除conio.h
  2. getch()替换为getchar() 注意
  3. void main()int main(void)
  4. 删除clrscr()感谢Paul R先生
  5. 另请注意,

    1. getchar()返回int值。您正试图将其收集到char。有时,(例如,EOF)返回值可能不适合 a char。将ch更改为int类型。
    2. 您在while()循环内有一个未绑定增量的nindex用于输入。过长的输入会导致password的缓冲区溢出。始终限制索引。
    3. 完成输入character-by-charcater后,null - 终止数组,将其用作字符串。
    4. 注意:getchar()将回显输入的chacrater。它不会用*替换它。要隐藏输入(即,不要回显),你可以做

      1. 使用ncurses库。 echo() amd noecho()以及initscr()可以帮助您实现这一目标。这是实现目标的首选方式。

      2. [已废弃的方式] 使用unistd.h中的getpass()

答案 1 :(得分:0)

如果您的终端支持这些转义码,则会在输入密码时隐藏输入。

#include <stdio.h>

void UserPW ( char *pw, size_t pwsize) {
    int i = 0;
    int ch = 0;

    printf ( "\033[8m");//conceal typing
    while ( 1) {
        ch = getchar();
        if ( ch == '\r' || ch == '\n' || ch == EOF) {//get characters until CR or NL
            break;
        }
        if ( i < pwsize - 1) {//do not save pw longer than space in pw
            pw[i] = ch;       //longer pw can be entered but excess is ignored
            pw[i + 1] = '\0';
        }
        i++;
    }
    printf ( "\033[28m");//reveal typing
    printf ( "\033[1;1H\033[2J");//clear screen
}

int main ( ) {
    char password[20];

    printf ( "Enter your password: ");
    fflush ( stdout);//prompt does not have '\n' so make sure it prints
    UserPW ( password, sizeof ( password));//password array and size
    printf ( "\nentered [%s]\n", password);//instead of printing you would verify the entered password
    return 0;
}

答案 2 :(得分:0)

使用-cpp调用编译器并保存输出, 这将显示引用的每个头文件,隐式和显式。 很多时候,你会在不同的平台上找到替代的标题。