C - скопировать буфер в строку - это вообще возможно? - PullRequest
1 голос
/ 05 ноября 2011

возможно ли скопировать буфер в строку? strncpy может скопировать строку в выделенный массив строк, мне интересно, если это возможно сделать противоположное

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

Ответы [ 3 ]

1 голос
/ 05 ноября 2011

Во-первых, строка C - это не просто char, а массив char с последним элементом (или, по крайней мере, последним, который считается частью строки) с нулевым символом (численно *).1003 *, также '\ 0' как символьная константа).

Далее, в коде, который вы разместили, вы, вероятно, имели в виду char buffer[50], а не char *buffer[50] ... у вас есть версия массива 50 char * с, но вам нужен массив 50 char s.После того, как это будет исправлено, тогда ...

Поскольку fgets() всегда заполняет нулевой символ в конце прочитанной строки, buffer уже будет допустимой строкой C после вызова fgets().Если вы хотите скопировать ее в другую строку, чтобы можно было повторно использовать буфер для чтения дополнительных входных данных, вы можете использовать обычные функции обработки строк из <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() скопирует символы и ноль в конце из одной строки / буфера в другую.Он останавливается после нуля и не знает, сколько места вы выделили - поэтому вам нужно убедиться, что он найдет нулевой символ, прежде чем закончится свободное место в месте назначения или достигнет конца исходного буфера.Если вы сомневаетесь, поместите нулевое значение в конец буфера самостоятельно, чтобы убедиться.

0 голосов
/ 05 ноября 2011

Прежде всего, вы должны иметь:

char buffer[50];

, потому что в противном случае у вас есть массив 50 char * s, что не то, что вам нужно.То есть вы читаете 50 символов из ввода и создаете из них адреса (что означает «бум»!)

Во-вторых, да, вы можете использовать strncpy для копирования.Обратите внимание, что строка представляет собой массив символов, оканчивающихся на '\0' (NUL).Так что в этом случае buffer действительно строка.Вы хотели бы скопировать строку, только если вы хотите сохранить оригинал и изменить второй (или сохранить копию оригинала, а затем изменить буфер).В противном случае вы можете безопасно использовать тот же буфер, что и нужную строку.

В-третьих, я не знаю, как именно выглядит ваш ввод, но что вы хотите сделать, вы, скорее всего, можете сделать это лучше с *scanf функций.

0 голосов
/ 05 ноября 2011

Это должно быть char buffer[50];, и да, тогда вы можете использовать strncpy (который не заботится о том, получил ли он статическую или выделенную кучу зону).

Но я бы порекомендовал использовать getline в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...