C - 将缓冲区复制到字符串 - 它甚至可能吗?

时间:2011-11-05 17:29:16

标签: c string buffer

是否可以将缓冲区复制到字符串? strncpy可以将字符串复制到已分配的字符串数组中,我想知道这是否可以做相反的事情

char *buffer[50];
fgets(buffer, 50, stdin);
//how can i assign string in buffer to a single string (char)?

3 个答案:

答案 0 :(得分:1)

首先,C字符串不仅仅是char,而是一个char数组,其最后一个元素(或者至少是最后一个被计为字符串一部分的元素)设置为null字符(数字0,'\ 0'作为字符常量)。

接下来,在你发布的代码中你可能意味着char buffer[50]而不是char *buffer[50] ...你拥有的版本是一个50 char *的数组,但你需要一个数组50 char s。在那之后纠正,然后......

由于fgets()总是在它读取的字符串末尾填入一个空字符,因此buffer在调用fgets()后已经是一个有效的C字符串。如果您想将其复制到另一个字符串以便可以重用缓冲区来读取更多输入,则可以使用<string.h>中常用的字符串处理函数,例如strcpy()。只需确保将其复制到的字符串足以容纳所有使用过的字符和一个终止空字符。

此代码将字符串复制到新的malloc() ed字符串中(省略错误检查):

char buffer[50];
char *str;
fgets(buffer,50,stdin);
str = malloc(strlen(buffer) + 1);
strcpy(str,buffer);

此代码执行相同操作,但复制到堆栈上的char数组(不是malloc() ed):

char buffer[50];
char str[50];
fgets(buffer,50,stdin);
strcpy(str,buffer);

strlen()将告诉您字符串中使用了多少个字符,但不计算终止空值(因此您需要再分配一个字符而不是strlen()返回的字符)。 strcpy()会将字符和空值从一个字符串/缓冲区复制到另一个字符串/缓冲区。它在null之后停止,并且不知道您分配了多少空间 - 因此您需要确保它在目标中的空间不足或到达源缓冲区的末尾之前找到空字符。如果有疑问,请自行在缓冲区末尾放置一个空值以确保。

答案 1 :(得分:0)

它应该是char buffer[50];,是的,您可以使用strncpy(它不关心它是否有静态或堆分配区域。)

但我建议您使用getline

答案 2 :(得分:0)

首先,您必须:

char buffer[50];

因为否则你有一个50 char *的数组,这不是你想要的。也就是说,你从输入中读取50个字符并从中创建地址(这意味着“繁荣”!)

其次,是的,您可以使用strncpy进行复制。请注意,字符串基本上是一个字符数组,以'\0'(NUL)结尾。所以在这种情况下,buffer确实是一个字符串。如果要保留原始字符串并修改第二个字符串(或保留原始副本然后修改缓冲区),则只需要复制字符串。否则,您可以安全地使用与所需字符串相同的缓冲区。

第三,我不知道您的输入究竟是什么样的,但是您想要做什么,您最有可能使用*scanf函数做得更好。