我需要更改什么才能使此 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 和
的指针
- 删除
conio.h
- 将
getch()
替换为 getchar()
注意
void main()
到 int main(void)
.
- 删除
clrscr()
。 感谢 Paul R. 先生
另请注意,
getchar()
return 一个 int
值。您正在尝试将其收集到 char
中。有时,(例如 EOF
)return 值可能 不适合 和 char
。将 ch
更改为 int
类型。
- 您在
while()
循环中有一个 未绑定 增量的 nindex 用于输入。过长的输入会导致 password
的缓冲区溢出。始终限制索引。
- 完成逐个字符的输入后,
null
终止数组,将其用作字符串。
注意:getchar()
将回显输入的字符。它不会用 *
替换它。要隐藏输入(即不回显),你可以
如果您的终端支持这些转义码,这将在输入密码时隐藏输入。
#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。
我需要完成这项工作 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 和
的指针- 删除
conio.h
- 将
getch()
替换为getchar()
注意 void main()
到int main(void)
.- 删除
clrscr()
。 感谢 Paul R. 先生
另请注意,
getchar()
return 一个int
值。您正在尝试将其收集到char
中。有时,(例如EOF
)return 值可能 不适合 和char
。将ch
更改为int
类型。- 您在
while()
循环中有一个 未绑定 增量的 nindex 用于输入。过长的输入会导致password
的缓冲区溢出。始终限制索引。 - 完成逐个字符的输入后,
null
终止数组,将其用作字符串。
注意:getchar()
将回显输入的字符。它不会用 *
替换它。要隐藏输入(即不回显),你可以
如果您的终端支持这些转义码,这将在输入密码时隐藏输入。
#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。