【问题标题】:Using strcat() to concatenate two values gathered from void functions使用 strcat() 连接从 void 函数收集的两个值
【发布时间】:2018-05-24 12:37:33
【问题描述】:

我试图连接从两个不同函数返回的两个值,一个服务器 IP 地址和一个学生 ID。用于获取这些功能的函数已成为无效函数,以便访问服务器。我想使用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

我之前尝试过的任何代码都返回了错误

无效的表达式使用

【问题讨论】:

  • strcat 在哪里?
  • 它不存在,我一直在尝试和错误使用 strcat() 的许多不同方式,每次我实现它时,它都会返回“无效使用表达式”,已经使用了 3 个小时所以不知道要放什么实现
  • 哦 - 你没有返回任何指针两个函数。所以你不能在 strcat() 中使用它。
  • 谢谢,回到绘图板
  • "用来获取这些的函数已经是无效函数,以便访问服务器。"这是什么意思?

标签: c server concatenation void strcat


【解决方案1】:

你的函数get_ipaddress 应该要么 malloc 并返回一个 IPv4 地址,要么被赋予一个 string/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()

现在您可以在 main 中执行以下操作:

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)。

【讨论】:

  • 一个函数,它需要一个指向缓冲区的指针来填充应该总是还有一个参数是缓冲区的大小。否则你会打开各种缓冲区溢出问题。
  • @ChrisDodd 你说得对,我写的代码很快,但我可能应该推广好的做法。答案已更新。
  • @JacobH 这是很棒的代码,但是在实现代码时,我遇到了分段错误。从菜单选项运行代码时,函数名后面的 () 中是否应该有任何内容?
  • strncpy 很危险,因为它不能正确地对(太)长输入进行空终止,因此您需要显式添加空终止符。或者,(更灵活地)只使用 snprintf 并返回它的返回值(这是(必需的)长度),而不是返回 void。
猜你喜欢
  • 1970-01-01
  • 2020-08-19
  • 2015-02-07
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多