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

What do I need to change to make this C programm work on Linux?

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

旧代码:

#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;
}

一些指向 start

的指针
  1. 删除conio.h
  2. getch() 替换为 getchar() 注意
  3. void main()int main(void).
  4. 删除 clrscr()感谢 Paul R. 先生

另请注意,

  1. getchar() return 一个 int 值。您正在尝试将其收集到 char 中。有时,(例如 EOF)return 值可能 不适合 char。将 ch 更改为 int 类型。
  2. 您在 while() 循环中有一个 未绑定 增量的 nindex 用于输入。过长的输入会导致 password 的缓冲区溢出。始终限制索引。
  3. 完成逐个字符的输入后,null终止数组,将其用作字符串。

注意:getchar() 将回显输入的字符。它不会用 * 替换它。要隐藏输入(即不回显),你可以

  1. 使用 ncurses library. echo() amd noecho() along with initscr() 可以帮助您实现这一目标。这是实现您想要的效果的首选方法。

  2. [过时的方式] 使用 getpass() 来自 unistd.h.

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

#include <stdio.h>

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

    printf ( "3[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] = '[=10=]';
        }
        i++;
    }
    printf ( "3[28m");//reveal typing
    printf ( "3[1;1H3[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;
}

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