我有一个函数打印服务器上连接的所有客户端。我想将所有客户端放在char(list lst)列表中,因为我需要在其他函数中使用它们。当我想迭代列表lst和打印元素看起来像“$ @”。我不明白为什么。 这些是功能:
void get_clients_list(){
int dim,i = 0,n;
char buff[255];
bzero(buff,sizeof(buff));
recv(srv_fd,buff,sizeof(buff),0);
dim = atoi(buff);
printf("\t%d clients available:", dim);
printf("\n");
while(i < dim){
memset(buff, 0, sizeof(buff));
recv(srv_fd, buff, sizeof(buff),0);
if(n < 0){
error("ERROR reading from socket");
}
lst.push_back(buff);
printf("\t\t%s", buff);
printf("\n");
i++;
}
}
以下是我如何遍历列表lst:
get_clients_list();
iter = lst.begin();
while(iter != lst.end()) {
iter ++;
printf("clients:");
printf("%s \n",iter);
}
为什么它不打印客户端而只出现一些象形文字?
答案 0 :(得分:2)
您在此处添加了一个指向局部变量的指针:
lst.push_back(buff);
这是未定义的行为。同样,您需要使用*iter
来获取迭代器的内容:
printf("%s \n",*iter);
由于您使用的是C ++,因此使用std::string
和iostream
库会更简单,更不容易出错。坚持使用这里的代码就是一个小例子:
#include <string>
#include <vector>
#include <iostream>
int main()
{
char buff[] = "hello, world" ;
std::vector<std::string> lst;
lst.push_back( buff ) ;
std::vector<std::string>::iterator iter = lst.begin() ;
// In C++11 could be replaced with
//auto iter = lst.begin() ;
while( iter != lst.end() )
{
std::cout << *iter << std::endl ;
++iter ;
}
}