我正在使用下面的代码将字符数组转换为字符串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++;
}
}
Run Code Online (Sandbox Code Playgroud)
我期望的结果是
a Character here
a String here
b Character here
b String here
c Character here
c String here
d Character here
d String here
Run Code Online (Sandbox Code Playgroud)
但是我把它作为输出
a Character here
abcd String here
b Character here
bcd String here
c Character here
cd String here
d Character here
d String here
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?
data
已经是一个字符串,因为它是一个以空字符结尾的字符序列(字符串在C中).
你得到这些结果是因为你snprintf
在循环中调用data
.
首先,你叫snprintf()
上&data[0]
,其拷贝data
到您的缓冲区来自data[0]
直到它到达空.然后调用snprintf()
上data[1]
,其拷贝到您的缓冲区来自&data[1]
直到它到达空.等等...
每次执行此操作时,都会printf()
使用%s
参数调用缓冲区...将参数打印为字符序列,直到达到终止空值(即%s
打印字符串).
如果要打印单个字符,请使用%c
.如果要逐个字符地打印到缓冲区,直到达到空值,请手动执行 - 但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;
}
Run Code Online (Sandbox Code Playgroud)
手动复制/打印每个字符:
#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;
}
Run Code Online (Sandbox Code Playgroud)