c[100] 是 char 的向量,x 是 1 到 9 之间的数字
如何将 x 存储在 c 中的给定位置 (n)
我尝试的是:
sprintf(c[n], "%d", x);
但是不起作用
如果我写:
sprintf(&c[n], "%d", x);
效果很好。有人可以向我解释这是为什么吗?或者也许给我另一个解决问题的想法
首先要理解的是,当你声明
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
。