使用strcat()连接从void函数收集的两个值
我试图连接从两个不同函数返回的两个值,一个服务器IP地址和一个学生ID。用于获取这些值的函数是void函数,以便访问服务器。我想使用使用strcat()连接从void函数收集的两个值,c,server,concatenation,void,strcat,C,Server,Concatenation,Void,Strcat,我试图连接从两个不同函数返回的两个值,一个服务器IP地址和一个学生ID。用于获取这些值的函数是void函数,以便访问服务器。我想使用strcat()函数,但无法使其成功运行。下面的代码成功地从服务器返回了这两个值 void get_ipaddress(void) { int fd; struct ifreq ifr; printf("IP Address:"); fd = socket(AF_INET, SOCK_DGRAM, 0); /* I want t
strcat()
函数,但无法使其成功运行。下面的代码成功地从服务器返回了这两个值
void get_ipaddress(void)
{
int fd;
struct ifreq ifr;
printf("IP Address:");
fd = socket(AF_INET, SOCK_DGRAM, 0);
/* I want to get an IPv4 IP address */
ifr.ifr_addr.sa_family = AF_INET;
/* I want an IP address attached to "eth0" */
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);
ioctl(fd, SIOCGIFADDR, &ifr);
close(fd);
/* Display result */
printf("%s\n", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
}
void get_studentid(int socket)
{
char studentid[32];
size_t k;
readn(socket, (unsigned char *) &k, sizeof(size_t));
readn(socket, (unsigned char *) studentid, k);
printf("Student ID: %s\n", studentid);
} // end get_studentid()
我正在努力获得输出
192.168.229.128:S1427722
我以前尝试过的任何代码都返回了错误
void表达式的无效使用
您的函数
get\u ipaddress
应该是malloc并返回一个IPv4地址,或者指定一个字符串/char[]来填充。因此,您可以将其更改为:
void get_ipaddress(char *addr, int n)
{
/* ... */
// Copy the string into our buffer
strncpy(addr, inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr), n);
}
get\u studentid
应相同:
void get_studentid(int socket, char *studentid, int n)
{
size_t k;
unsigned char *buf;
readn(socket, (unsigned char *) &k, sizeof(size_t));
buf = malloc(k);
readn(socket, buf, k);
strncpy(studentid, buf, n);
free(buf);
} // end get_studentid()
现在,在您的主要任务中,您可以:
int main(void) {
char s_id[32] = {0};
char ipaddr[32] = {0};
char output[64] = {0};
int sock;
// Call the functions
get_ipaddress(ipaddr, 32);
// Open your socket here
get_studentid(sock, s_id, 32);
// Format the output
snprintf(output, 64, "%s: %s", ipaddr, s_id);
// Print the result
printf("%s\n", output);
}
这利用了sprintf(),它被格式化为打印字符串,至少在这方面它比strcat好,因为对于strcat,您需要连接两次(“:”和studentid)。strcat在哪里?它不在那里,我已经尝试了许多不同的使用strcat()的方法每次我实现它时,它都会返回“表达式的无效使用”,已经使用了3个小时,所以不知道应该在inOh中使用什么实现-您不会在函数中返回任何指针。因此,您不能在strcat()中使用它。无论如何,谢谢您,回到绘图板上“用于获取这些的函数都是void函数,以便访问服务器”。这意味着什么?使用指向缓冲区的指针来填充的函数也应该始终有一个参数,即缓冲区的大小。否则会引发各种各样的缓冲区溢出问题。@chrisdsodd你是对的,我写代码很快,但我可能会推广良好的实践。答案已经更新了。@JacobH这是一个很棒的代码,但是在实现代码时,我遇到了一个分段错误。当从菜单选项运行代码时,函数名后面的()中是否有任何内容?
strncpy
是危险的,因为它不能正确地空终止(太长)输入,因此需要显式添加空终止符。或者,(更灵活地)只需使用snprintf
并返回该长度的返回值,而不是返回void。