使用strcat()连接从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

我试图连接从两个不同函数返回的两个值,一个服务器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 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。