在c中使用snprintf中的const char数组

时间:2017-03-17 20:40:45

标签: c arrays char printf const

我是C的新来者。我有这种类型的代码,当我尝试执行它时,这条警告消息显示“传递参数1''snprintf'丢弃'const'限定符来自指针目标类型”和什么也没发生。

我做错了什么? 谢谢

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
  int i;
  const char *msg[3] = {"Hello", "Good Morning", "Hello World"};
  const char *strings[];


  for(i=0; i<3; i++)
  snprintf(strings[i], 20, "%s %d", msg[i], i);

  for(i=0; i<3; i++)
  printf("strings[%d]: %s\n", i, strings[i]);

  return 0;
}

2 个答案:

答案 0 :(得分:2)

snprintf(strings[i], 20, "%s %d", msg[i], i);

试图写入strings[i]。由于它被声明为常量,编译器只是拒绝这样做,因为它违反了合同。

但是在这里,它更严重:strings[i]没有为字符串甚至指针(!)分配任何内存,因此删除const限定符将运行程序时会导致未定义的行为。

答案 1 :(得分:0)

您需要为要打印的每个字符串分配空间,例如

char *strings[3];
for (i = 0; i < 3 ; ++i) {
    size_t length = snprintf(NULL, 0, "%s %d", msg[i], i);
    strings[i] = malloc(length + 1);
    if (string[i] != NULL) {
        snprintf(strings[i], length, "%s %d", msg[i], i);
    }
}

for (i = 0; i < 3 ; ++i) {
    if (string[i] != NULL) {
        printf("string[%d]: %s\n", i, strings[i]);
    }
}

在第一部分中,我们在堆栈上分配3个poitner。然后,对于每个字符串,我们首先计算长度,然后snprintf()进入成功分配的内存。