使用C中的snprintf将char转换为字符串

am3*_*am3 0 c string char

我正在使用下面的代码将字符数组转换为字符串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)

有人可以解释一下吗?

Isk*_*rak 7

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)