我有一些代码可以从一个从套接字接收到的字符串中获取所有字符(连接很好,不包括与之连接的变量)。如您所见,在预处理字符串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 :(得分: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);