使用strcat()连接从void函数收集的两个值

时间:2017-12-11 01:25:34

标签: 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 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表达式

1 个答案:

答案 0 :(得分:1)

你的函数get_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_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)。