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

时间:2015-05-08 03:21:29

标签: 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++;
    }
}

我期望的结果是

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

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:7)

data已经是一个字符串,因为它是一个以空字符结尾的字符序列(字符串在C中)。

您收到这些结果是因为您在snprintf的循环内呼叫data

首先,您致电snprintf() &data[0]datadata[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;
}