Как ограничить функцию scanf в C, чтобы печатать ошибки, когда ввод слишком длинный?

Я хочу ограничить функцию scanf, чтобы при вводе, например,char* array <String...>, который имеет более 30 символов, он не получит его, и мой вывод будет ошибкой.

У меня есть подсказка, чтобы использовать [^ n] или что-то в этом роде, но я не понимаю, как это сделать? Я знаю, что я могу использоватьscanf("%30s"..) но я не хочу, чтобы ввод был действительным, а только ошибка.

Любая помощь будет отличной.

 Jerry Coffin04 июн. 2012 г., 20:52
Я уверен, что такого нет. Учитывая 30 символов, которые соответствуют вашей спецификации конверсии, он будет успешным, независимо от того, может ли быть что-то еще. Вы должны прочитать следующий символ и убедиться, что это новая строка или что-то в этом роде (но это не вернет 30 прочитанных символов).

Ответы на вопрос(6)

http: //linux.die.net/man/3/sscan и ищи% П спецификатор формата. Я также рекомендовал бы посмотреть возвращаемое значение функции sscanf, которое сообщит вам количество отформатированных аргументов, а также наличие ошибки.

Я использовал% П спецификатор формата, помогающий разобрать строку параметров:

        ret = sscanf(line, "%d %d %s %d %d %n", &iLoad, &iScreen, &filename, &stage, &bitmapType, &offset);

Число символов, отформатированных предыдущими аргументами, сохраняется в переменной Смещение.

fgets а такжеsscanf. Сfgets вы можете прочитать чуть больше, чем30 символов, а затем убедитесь, что вы не получили больше, чем30 символы

Или, если вы действительно хотите использоватьscanf используйте это с чем-то большим, чем30 нравится%32s.

 user138696604 июн. 2012 г., 20:58
Наш профессор сказал нам, к сожалению, использовать scanf, и дал подсказку - scahnf ("% [^ n * c), но я не понимаю: O

Ну, в C вы можете сделать:

#include <string.h>

...

if(strlen(array_ptr) > 0) error();

Очевидно, что вам нужен больший буфер, чтобы сначала получить входные данные, а затем проверить его длину, чтобы массив мог иметь, например, размер. 512 байт. Когда вы копируете в него строки, вам нужно убедиться, что вы получаете 0 в конц

 Andrew04 июн. 2012 г., 21:07
:-) Итак, вас попросили обработать коды ошибок из функции scanf - ну, scanf возвращает количество совпадений, но если коды соответствуют или как их указать, это выглядит немного сложным вопросом. Вы должны быть на уроках, которые вы знали бы; -)

щих символов.

  int iCharCount = 0;

  ch = getchar();
  while( ch != EOF ) {
      iCharCount++;
      if(30 < iCharCount)
      {
        printf("You have attempted to enter more than 30 characters.\n");
        printf("Aborting.");
        break;
      }
      printf( "%c", ch );
      ch = getchar();
   }

Это грубый пример. Если бы это зависело от меня, я бы выделил массив символов максимального размера, прочитал бы всю строку, а затем использовал бы строковые утилиты для подсчета, редактирования и т. Д.

 octopusgrabbus04 июн. 2012 г., 21:07
@ moooeeeep Спасибо. Выполнено

sscanf, очень хорошо для такого рода вещей, но осторожныйscanf тоже может сделать это. Вам нужно убедиться, что вы правильно ограничиваете количество символов, которое может ввести пользователь, поэтому% 31s будет означать, что максимум 30 символов + знак\0 нулевой терминатор (31).

То, что вы предотвращаете, это атаки переполнения буфера, которые могут быть чрезвычайно эффективными способами сломать небрежно написанные c-программы. Вот отличная статья Aleph One на BO:http: //insecure.org/stf/smashstack.htm

Решение Вопроса

scanf тогда я считаю, что лучшее, что вы можете сделать, это использовать спецификатор ширины с чем-то вроде:"%31s", как вы уже упоминали, затем используйтеstrlen, чтобы проверить длину ввода, и отбросить строку и сообщить об ошибке, если ввод превышает ваш предел.

Или, возможно, пропуститьstrlen дополнительно используя%n в строке формата, например"%31s%n".

Строка формата, использующая что-то вроде%[^\n] на месте%s просто инструктирует функцию продолжать чтение до новой строки, занимая другие пробельные символы по пути. Это полезно, если вы хотите разрешить вводу включать пробельные символы.

Просмотрите документы для scanf Здесь копия справочной страницы).

 pb2q04 июн. 2012 г., 21:26
@ markgz: Спасибо, отредактировал.
 markgz04 июн. 2012 г., 21:24
Я думаю, ты хотел сказать%31[^\n].

Ваш ответ на вопрос