Как читать массив без знака с помощью gets ()? - PullRequest
2 голосов
/ 28 мая 2011

Мне нужно прочитать количество беззнаковых символов из ввода (значение ASCII> 127).Так что я использовал -

unsigned char S[102];

, но когда я беру ввод, как это-

 gets(S);

ошибка компилятора:

ошибка: недопустимое преобразование из неподписанногоchar * 'to' char * '

Так что мой вопрос в том, как читать массив символов без знака с помощью gets () или любой другой функции.

Ответы [ 2 ]

2 голосов
/ 28 мая 2011

Во-первых, вы никогда не должны использовать gets.Он не может безопасно использоваться ни при каких обстоятельствах.Мой комментарий, возможно, был немного гиперболическим для юмористического эффекта, но точка зрения остается неизменной.

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

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

Если вы на самом деле считываете двоичные данные в массив без знака, вам следует изучитьfread.В отличие от fgets требуется void * для размещения любого типа данных, которые вам нужно прочитать, поэтому приведение не потребуется.Обратите внимание, что fread читает куски, а не строки, поэтому, если вы хотите текстовый ввод, вам следует искать в другом месте - он не будет пытаться прочитать всю строку и не прекратит чтение в буфер, когда увидит окончание строки.

1 голос
/ 28 мая 2011

Вместо gets вы можете использовать:

  • fgets (s, MAX_BUFFER, stdin);
  • scanf ("%[^\n]%*c", s);

Оба будут работать при получении символов ASCII сзначения, превышающие 127, такие как: .±┼┤.␤▒⎽␤ .␍≤┼⎽≤└ .␍≤┼⎽├⎼ .±┼┤.┴␊⎼⎽␋⎺┼ .±┼┤.┴␊⎼⎽␋

gets также сделают это.Вам не нужно передавать ваш массив как unsigned char *.

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