c - 仅显示最后一个字符串的字符串数组

标签 c arrays char

我有一些代码可以从从套接字接收到的字符串中获取所有字符(连接很好,不包括连接到它的变量)。如您所见,在我分配给我的字符串数组 logins 的预处理字符串 log_res_str 中,一切都很好。但是当我打印出各自的登录名时,它只显示第二个。有什么问题?

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

最佳答案

问题是 logins[i] = log_res_str 存储了指向 log_res_str 缓冲区的指针,而不是字符串本身。

如果你想要一个字符串的副本,你必须为副本分配内存,然后复制字符串。如果字符串以 null 结尾,您可以使用 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);

关于c - 仅显示最后一个字符串的字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29462166/

相关文章:

c - 确定哪些共享库调用我的共享

c - C 中的霍纳法则

Javascript:有效地比较两个整数数组

javascript - 如何使用过滤器将两个数组中的 JSON 对象推送到一个新数组中?

java - char 和 int 相加的结果

c# - 检查基本拉丁字母 (A-Z) 的最简单方法

c++ - 如果我不给它一点额外的空间,弦就会发疯。谁能解释这里发生了什么?

c - IPC_CREAT 有什么用? 0666 C 中 shmget() 函数中的标志

c - 增加数组大小。在 increaseSize 函数之后,同一数组的某些参数无效。铿锵

java - 将哈希表上的字符数组转换为整数