Во-первых, вы никогда не должны использовать gets
.Он не может безопасно использоваться ни при каких обстоятельствах.Мой комментарий, возможно, был немного гиперболическим для юмористического эффекта, но точка зрения остается неизменной.
Функция, которую вы должны использовать вместо gets
, равна fgets
.fgets
принимает указатель FILE *
(но вы, вероятно, просто захотите передать stdin
) и максимальную длину, чтобы он знал, не переполнять ли ваш буфер.В отличие от gets
, fgets
не гарантирует чтение всей строки - строка может быть слишком большой для вашего буфера для хранения.Вы можете, однако, легко восстановиться после этого и написать код для правильной обработки ввода различными способами (тогда как с gets
вам просто нужно надеяться, что ваш буфер достаточно длинный, а если нет, кто знает, что произойдет.)
Мне немного неясно, какие данные вы собираетесь читать.Если это текст, fgets
, вероятно, то, что вы ищете.Для этого все еще требуется char *
, поэтому для этой работы вам необходимо привести S
к char *
, когда вы передадите его функции.Обычно приведение является плохой вещью, особенно приведение типов со знаком к неподписанному, но в этом случае (скорее всего) ничего плохого не произойдет.
Если вы на самом деле считываете двоичные данные в массив без знака, вам следует изучитьfread
.В отличие от fgets
требуется void *
для размещения любого типа данных, которые вам нужно прочитать, поэтому приведение не потребуется.Обратите внимание, что fread
читает куски, а не строки, поэтому, если вы хотите текстовый ввод, вам следует искать в другом месте - он не будет пытаться прочитать всю строку и не прекратит чтение в буфер, когда увидит окончание строки.