2015-04-05 218 views
1

我有一些代碼從一個從套接字接收的字符串中獲取所有字符(連接沒問題,不包括連接到它的變量)。正如你所看到的,在預處理字符串log_res_str我分配給我的字符串數組logins,一切都很好。但是,當我打印出各自的登錄名時,它只顯示第二個登錄名。有什麼問題?只顯示最後一個字符串的字符串數組

int logincount = 2; 
char login_buff[CHUNK_SIZE] = {0}; 
char *logins[100]; 
char log_res_str[CHUNK_SIZE] = {0}; 
for(int i = 0; i < logincount; i++) 
{ 
    int lenf = 0; 
    int received = 0; 
    memset(login_buff, 0, sizeof(login_buff)); 

    // the length of the UID stored in the first byte 
    if((received = recv(client_sock, login_buff, CHUNK_SIZE, 0)) < 0) 
     DIE("Receive Error"); 

    // getting the lenght of the login 
    lenf = login_buff[0] - '0'; 
    for(int count = 1; count < lenf; count++) 
     log_res_str[count-1] = login_buff[count]; 

    printf("log_res_str: %s\n", log_res_str); 
    logins[i] = log_res_str; 

    printf("login: %s\n", logins[i]); 

    // acknowledgment 
    if(send(client_sock, login_buff, sizeof(login_buff), 0) < 0) 
     DIE("Acknowledge Error"); 
} 

這就是我得到:

log_res_str: root 
log_res_str: _warmd 
login: _warmd 
login: _warmd 

這就是我想要的:

og_res_str: root 
log_res_str: _warmd 
login: root 
login: _warmd 
+0

'登錄[I] = 1 og_res_str'存儲一個指向'log_res_str'緩衝區的指針,而不是字符串本身。如果你想要一個字符串副本,你必須爲拷貝分配內存,然後複製(使用'malloc' +'strcpy'或'strdup')。 – SleuthEye 2015-04-05 21:05:50

+0

@SleuthEye你可以把它給一個答案?工作,我想接受你的解決方案。 – jvitasek 2015-04-05 21:08:49

回答

0

的問題是,logins[i] = log_res_str存儲指針log_res_str緩衝區,而不是字符串本身。

如果您想要一個字符串副本,您必須爲副本分配內存,然後複製該字符串。如果字符串爲空值終止的,你可以用任何malloc其次是strcpy做到這一點:

logins[i] = malloc(lenf); 
strcpy(logins, log_res_str); 

或者乾脆strdup

logins[i] = strdup(log_res_str); 

如果另一方面在log_res_str輸入字符串不爲空封端的(或至少不能保證是),那麼就應該使用memcpy用於複製:

logins[i] = malloc(lenf+1); // +1 if you want a null-terminated copy 
logins[i][lenf] = '\0';  // this line only if you allocated +1 above 
memcpy(logins, log_res_str, lenf); 
相關問題