1

这是我的代码:

  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然后我认为我必须将其返回到主程序......但是:

  1. 我不知道如何(return p;我收到警告)
  2. 也可以在没有的情况下工作,return p;所以我认为一切都好......但我不太确定......

我不明白 return 如何与函数一起工作。

4

4 回答 4

2
  1. 具有void返回类型的函数不应返回任何内容。
  2. 您可以随时使用该return;语句从函数返回给调用者。
  3. 如果没有return;到达任何语句,并且函数到达其结尾,则将控制权返回给它的调用者。
于 2012-05-02T21:43:52.663 回答
2
int main() 
{
   char * password = NULL;

   get_pass(&password); //that is how you want to pass pointer to pointer

}

void get_pass(char **password) 
{

//1. get password using scanf from stdin or whatever way you want. 
//2. assign it to *password 
//3. no need to return anything

}

请记住,您需要处理密码字符串的内存分配。假设您想将密码大小固定为 MAX_PASS_SIZE,然后在 main() 或 get_pass 中分配那么多内存,以免损坏堆栈内存。我写的上面的代码片段只是展示了如何将值填充到密码中,这可能是你的主要问题,即将指针传递给指针。

于 2012-05-02T22:02:31.560 回答
1

get_pass 被定义为返回 void,它什么都不是。在这种情况下,返回值通过参数 p 传递。

于 2012-05-02T21:43:57.843 回答
1

如果您希望能够在密码中允许空格,则可以使用以下内容。关闭行缓冲并一次处理一个字符而不是使用fscanf.

    #include <stdio.h>
    #include <errno.h>
    #include <termios.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>

    void get_pass(char *p);
    void flushStdin( void );

    int main(){
        // what you have now in your code.
    }



    void flushStdin( void )
    {
        int c;

        while ((c = getchar()) != '\n' && c != EOF);

        return;
    }


    void get_pass(char *p){

    int i = 0;
    int c;
    /* 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;
    term.c_lflag &= ~ICANON;
    tcsetattr(STDIN_FILENO, TCSANOW, &term);
    /* Leggo la password e controllo il 'return code' di fscanf */

    flushStdin();
    while( (( c = getchar() ) != '\n') && (i < 63) )
    {
        if( c != 127 )  // did user hit the backspace key?
        {
            p[i++] = (char)c;
        }
        else
        {
            // null last character in password and backup to one space in string
            // should make sure i doesn't go negative... oops.
            if( i > 0 )
            {
                p[--i] = 0x00;
            }
        }
    }

    tcsetattr(STDIN_FILENO, TCSANOW, &term_orig);

    return;
}
于 2012-05-02T23:09:33.687 回答