0

これが私のコードです:

tmpip = get_public_ip();
pubip = strtok(tmpip, "\n");
sprintf(buffer, "220 FTPUtils Server [%s]", pubip);
len_string = strlen(buffer)+1;
if(send(newsockd, &len_string, sizeof(len_string), 0) < 0){
    perror("Errore invio len buffer");
    onexit(newsockd, sockd, 0, 2);
}
if(send(newsockd, buffer, len_string, 0) < 0){
    perror("Errore durante l'invio");
    onexit(newsockd, sockd, 0, 2);
}
pubip = NULL;
free(tmpip);
memset(buffer, 0, sizeof(buffer));


if(recv(newsockd, &len_string, sizeof(len_string), MSG_WAITALL) < 0){
    perror("Errore ricezione len user buffer");
    onexit(newsockd, sockd, 0, 2);
}
if(recv(newsockd, buffer, len_string, 0) < 0){
    perror("Errore ricezione del nome utente");
    onexit(newsockd, sockd, 0, 2);
}       
user_string = strtok(buffer, " ");
username = strtok(NULL, "\n");
fprintf(stdout, "%s %s\n", user_string, username);
sprintf(saved_user, "%s", username);
memset(buffer, 0, sizeof(buffer));

if(recv(newsockd, &len_string, sizeof(len_string), MSG_WAITALL) < 0){
    perror("Errore ricezione len pass buffer");
    onexit(newsockd, sockd, 0, 2);
}
if(recv(newsockd, buffer, len_string, 0) < 0){
    perror("Errore ricezione password");
    onexit(newsockd, sockd, 0, 2);
}
pass_string = strtok(buffer, " ");
password = strtok(NULL, "\n");
fprintf(stdout, "%s %s\n", pass_string, password);
memset(buffer, 0, sizeof(buffer));

printf("%s %s\n", username, password);

私は最後のデバッグに問題があります:それは何もprintfstdoutに出力しません!! ポインタ(ユーザー名とパスワード)がクリアされるのはなぜですか?2つは完璧に機能 するので奇妙ですが、最後は...

fprintfprintf

4

1 に答える 1

5

usernameと の両方がpassword 内の場所を指していますbuffer。それがどのように機能するかstrtokです。

つまり、 を使用してバッファをゼロにすると、 とポイントmemsetするメモリがゼロになります。簡単な回避策は、そのメモリを複製することです。usernamepassword

username = strtok(NULL, "\n");
username = strdup(username);

Noteは標準ではありませんが、とstrdupを使用して実装するのは非常に簡単です。mallocstrcpy

于 2012-09-02T13:45:56.403 に答える