Проблема с scanf () на Mac - PullRequest
       5

Проблема с scanf () на Mac

3 голосов
/ 30 августа 2010

Я компилирую библиотеку C на Mac OS X.Когда я набираю ввод и после печати на экране данных я ничего не вижу.

char *path = NULL;
peerdisplay = "Bob";
printf("Insert the full 'To' path: ");
scanf(" %a[^\n]", &path);
printf("A path: %s \n", &path);

Когда я заменяю% a на% s, печать идет нормально, но после запуска у меняошибка сегментации.Мне нравится запускать такие как скрипт.

Ответы [ 4 ]

2 голосов
/ 30 августа 2010

% a - это нестандартное расширение для gnu для сканирования. Что говорит об этом ваша OS X manpages?

Библиотека GNU C поддерживает нестандартное расширение, которое вызывает библиотека для динамического выделения строки достаточного размера для ввода строки для спецификаторов преобразования% s и% a [range]. Использовать этой функции, укажите в качестве модификатора длины (таким образом,% как или % В [диапазон]). Вызывающий должен освободить (3) возвращенную строку

^ это ваше намерение?

в этом случае, имейте в виду, что

Модификатор a недоступен, если программа скомпилирована с gcc -std = c99 или gcc -D_ISOC99_SOURCE (если _GNU_SOURCE также не указано fied), и в этом случае a интерпретируется как спецификатор для плавающей номера точек (см. выше).

2 голосов
/ 30 августа 2010

Вам необходимо выделить память для пути. Должно быть достаточно памяти для ввода любых байтов плюс завершающий байт NULL.

1 голос
/ 30 августа 2010

Прежде всего, если вы передаете null в scanf, как вы это делаете здесь, вы в основном говорите библиотеке c, чтобы она копировала любую строку, введенную в пустое пространство (или первую страницу памяти, обычно защищенную от записи). только по этой причине). Во-вторых,% a должен соответствовать числу с плавающей запятой, а не строке. В-третьих, было бы неплохо на самом деле прочитать документацию для библиотечной функции, прежде чем вы начнете ее вызывать.

1 голос
/ 30 августа 2010

Ваш path является нулевым указателем, сделайте так, чтобы он указывал на некоторую выделенную память, достаточно большую, чтобы содержать строку для чтения и завершающий null символ.

Вы не должны передавать адрес path до scanf и printf, вместо этого передайте path.

Поскольку вы сканируете строку, используйте %s вместо %a

...