这是我的代码:
void get_pass(char *p);
int main(){
char *host, *user, *pass;
host = malloc(64); /* spazio per max 64 caratteri */
if(!host) abort(); /* se malloc ritorna NULL allora termino l'esecuzione */
host[63] = '\0'; /* evitare un tipo di buffer overflow impostando l'ultimo byte come NUL byte */
user = malloc(64);
if(!user) abort();
user[63] = '\0';
pass = malloc(64);
if(!pass) abort();
pass[63] = '\0';
/* Immissione di hostname, username e password; controllo inoltre i 'return code' dei vari fscanf e, se non sono 0, esco */
fprintf(stdout,"--> Inserisci <hostname>: ");
if(fscanf(stdin, "%63s", host) == EOF){
fprintf(stdout, "\nErrore, impossibile leggere i dati\n");
exit(EXIT_FAILURE);
}
fprintf(stdout,"\n--> Inserisci <username>: ");
if(fscanf(stdin, "%63s", user) == EOF){
fprintf(stdout, "\nErrore, impossibile leggere i dati\n");
exit(EXIT_FAILURE);
};
fprintf(stdout, "\n--> Inserisci <password>: ");
get_pass(pass);
/* Stampo a video le informazioni immesse */
fprintf(stdout, "\n\nHost: %s\nUser: %s\nPass: %s\n\n", host,user,pass);
/* Azzero il buffer della password e libero la memoria occupata */
memset(pass,0,(strlen(pass)+1));
free(host);
free(user);
free(pass);
return EXIT_SUCCESS;
}
void get_pass(char *p){
/* Grazie a termios.h posso disabilitare l'echoing del terminale (password nascosta) */
struct termios term, term_orig;
tcgetattr(STDIN_FILENO, &term);
term_orig = term;
term.c_lflag &= ~ECHO;
tcsetattr(STDIN_FILENO, TCSANOW, &term);
/* Leggo la password e controllo il 'return code' di fscanf */
if(fscanf(stdin, "%63s", p) == EOF){
fprintf(stdout, "\nErrore, impossibile leggere i dati\n");
tcsetattr(STDIN_FILENO, TCSANOW, &term_orig);
exit(EXIT_FAILURE);
};
/* Reimposto il terminale allo stato originale */
tcsetattr(STDIN_FILENO, TCSANOW, &term_orig);
}
我想知道函数 get_pass 没有return
代码是否正确?
在这个函数中,我读取了密码,fscanf
然后我认为我必须将其返回到主程序......但是:
- 我不知道如何(
return p;
我收到警告) - 它也可以在没有的情况下工作,
return p;
所以我认为一切都好......但我不太确定......
我不明白 return 如何与函数一起工作。