我使用下面的代码将字符数组转换为字符串C.但是输出与我的预期不同。
#include<stdio.h>
int main()
{
char data[5] = {
'a', 'b', 'c', 'd', '\0'
};
char buff[100];
int i = 0;
while (data[i] != '\0')
{
printf("%c Character here \n", data[i]);
snprintf(buff, 100, "%s", & data[i]);
printf("%s String here\n", buff);
i++;
}
}
我期望的结果是
a Character here
a String here
b Character here
b String here
c Character here
c String here
d Character here
d String here
但我将此作为输出
a Character here
abcd String here
b Character here
bcd String here
c Character here
cd String here
d Character here
d String here
有人可以解释一下吗?
答案 0 :(得分:7)
data
已经是一个字符串,因为它是一个以空字符结尾的字符序列(字符串在C中)。
您收到这些结果是因为您在snprintf
的循环内呼叫data
。
首先,您致电snprintf()
&data[0]
,data
将data[0]
从snprintf()
复制到您的缓冲区,直到达到空。然后,您在data[1]
上调用&data[1]
,printf()
从%s
复制到您的缓冲区,直到达到空。等等...
每次执行此操作时,都会在缓冲区上调用%s
,并使用%c
参数...将参数打印为字符序列,直到达到终止空值(即{ {1}}打印一个字符串)。
如果要打印单个字符,请使用snprintf()
。如果要逐个字符地打印到缓冲区,直到达到空值,请手动执行 - 但snprintf()
的设计是为了让您不必这样做。
以更常见的方式使用#include<stdio.h>
int main() {
char data[5] = {'a', 'b', 'c', 'd', '\0'};
// or char data[] = "abcd";
char buff[100] = {0};
snprintf(buff, sizeof buff, "%s", data);
printf("%s String here\n", buff);
return 0;
}
:
#include<stdio.h>
int main() {
char data[5] = {'a', 'b', 'c', 'd', '\0'};
// or char data[] = "abcd";
char buff[100] = {0}; // initialises buff by filling it with zeroes
char *ptr = data, *buff_ptr = buff;
while (*ptr) {
*buff_ptr = *(ptr++);
printf("%s current\n", buff_ptr++);
printf("%s from the start\n", buff);
}
return 0;
}
手动复制/打印每个字符:
tag {
display: block;
}