首页 > 解决方案 > 找不到“格式参数过多”的问题

问题描述

我的 sprintf 语句有问题。我看到 6 个参数格式和 6 个提供的参数,但我收到以下错误:

jsonServer.c:450:4: 错误:未知转换类型字符 '}' 格式 [-Werror=format=]
sprintf(message, "{\"num_clients\": %d,\"num_requests\": %d, \"errors\": %d,\"uptime\": %u,\"cpu_time\": %lu,\"memory_used\": %l}", (numConnections+1), numRequests, numErrors, uptime, cpuTime, memUsed);
jsonServer.c:450:4:错误:格式参数过多 [-Werror=format-extra-args]

char *buildStatus()
{
   struct rusage *usage = malloc(sizeof(struct rusage));
   int usageRet = getrusage(RUSAGE_SELF, usage);
   if (usageRet == -1)
   {
      perror("RUSAGE fail");
      exit(EXIT_FAILURE);
   }
   long unsigned cpuTime = (usage->ru_utime).tv_sec + (usage->ru_stime).tv_sec;
   long memUsed = get_memory_usage_linux();
   unsigned int uptime = 0;

   char *message = malloc(1000);
   sprintf(message, "{\"num_clients\": %d,\"num_requests\": %d,\"errors\": %d,\"uptime\": %u,\"cpu_time\": %lu,\"memory_used\": %l}", (numConnections+1), numRequests, numErrors, uptime, cpuTime, memUsed);
   free(usage);
   return message;
}

我认为存在一些偷偷摸摸的转义字符问题,但是在到处都粘贴反斜杠之后,我似乎无法修复它。

标签: cprintf

解决方案


您所要做的就是纠正%l(没有这样的说明符),您可能应该使用%ld.

char *buildStatus()
{
   struct rusage *usage = malloc(sizeof(struct rusage));
   int usageRet = getrusage(RUSAGE_SELF, usage);
   if (usageRet == -1)
   {
      perror("RUSAGE fail");
      exit(EXIT_FAILURE);
   }
   long unsigned cpuTime = (usage->ru_utime).tv_sec + (usage->ru_stime).tv_sec;
   long memUsed = get_memory_usage_linux();
   unsigned int uptime = 0;

   char *message = malloc(1000);
   sprintf(message, "{\"num_clients\": %d,\"num_requests\": %d,\"errors\": %d,\"uptime\": %u,\"cpu_time\": %lu,\"memory_used\": %ld}", (numConnections+1), numRequests, numErrors, uptime, cpuTime, memUsed);
   free(usage);
   return message;
}

希望有帮助。


推荐阅读