使用 sprintf 将一位数存储在 char 向量中

问题描述 投票:0回答:1

c[100] 是 char 的向量,x 是 1 到 9 之间的数字

如何将 x 存储在 c 中的给定位置 (n)

我尝试的是:

sprintf(c[n], "%d", x);

但是不起作用

如果我写:

sprintf(&c[n], "%d", x);

效果很好。有人可以向我解释这是为什么吗?或者也许给我另一个解决问题的想法

c vector char
1个回答
0
投票

首先要理解的是,当你声明

char c[100]
时,你的程序会在当前帧的堆栈中为
c
保留100个字节。 (请记住:这意味着在函数返回后您不能继续使用
c
。)

当您试图理解

c
&c
之间的区别时,主要的困惑就出现了。当您使用
c
时,您将获得
c
的第一个元素的地址,其类型为
char[100]
。当您使用
&c
时,您将获得数组
c
的地址,其类型为
char (*)[100]
。令人困惑的是,两个是相同的。

#include <stdio.h>

int main(void) {
  char c[100];
  printf(" c: %p\n", c);  // will print (e.g.,):  c: 0x16d30b6c4
  printf("&c: %p\n", &c); // will print (e.g.,): &c: 0x16d30b6c4
  return 0;
}

话虽如此,当您使用

c[n]
时,您会在
char
n 位置获得实际的
c
。这不是地址;它是实际的字节值。当您使用
&c[n]
时,您将获得数组中位置n的地址(与
c + n
相同)。

#include <stdio.h>

int main(void) {
  char c[100] = "Testing";
  printf(" c: %p\n", c);        // will print (e.g.,) :  c: 0x16d30b6c4
  printf("&c: %p\n", &c);       // will print (e.g.,) : &c: 0x16d30b6c4
  printf(" c[2]: %c\n", c[2]);  // will print (always): s
  printf("&c[2]: %p\n", &c[2]); // will print (e.g.,) : &c[2]: 0x16d30b6c6
  printf("c + 2: %p\n", c + 2); // will print (e.g.,) : c + 2: 0x16d30b6c6
  return 0;
}

如果您查看 手册页中的

sprintf()
,您将看到定义是:

int sprintf(char *restrict s, const char *restrict format, ...);

忽略超出本答案范围的

restrict
sprintf()
期望的类型是
char *
(或指向
char
的指针)。根据上面的示例,表示
char[]
数组位置地址的正确方法是
&array[position]
。这就是为什么您的
sprintf(&c[n], "%d", x);
有效而
sprintf(c[n], "%d", x);
无效。

最后,始终考虑使用

snprintf()
,这将防止写入超出
char *
数组的边界。如果您的初始
size_t n
不是数组第一个字节的地址,请记住调整给予
snprintf()
char *restrict s

© www.soinside.com 2019 - 2024. All rights reserved.