2013-05-18 2 views
0

Вот прототип функции sscanf(), как описано в cplusplusreference (link):Исправить прототип sscanf(), "int sscanf (const char * s, const char * format, ...);" или int sscanf (char * s, const char * format, ...) ;?

int sscanf (const char * s, const char * format, ...); 

Но я нахожу что-то подозрительное о it.Not только делает вид первого аргумента отличается от многих других функций строки библиотеки как strcpy() (1) и strcat() (2) (const char* vs char*), но также представляется странным, как мы можем сделать массив, на который указывает первый аргумент константа, когда сама цель функции состоит в том, чтобы написать ему (изменить содержимое массив), используя этот указатель !!

Я имею в виду, в int sscanf (const char * s,const char * format, ...); мы не говорим через const классификаторе, что мы не можем изменить массив, на который указывает s с помощью s? Это опечатка на этом сайте или я что-то не понимаю? Пожалуйста, объясните.

+1

Голосовать за закрытие, так как OP желает, чтобы он был удален, и в будущем он никому не поможет. – hmjd

+0

Вы можете найти правильный прототип в спецификации POSIX ['sscanf()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/sscanf.html). –

+0

@JonathanLeffler Это нормально, если я ссылаюсь на ту ссылку, которую вы дали впредь вместо Cplusplusreference? – Jugni

ответ

1

const char * s

sscanf ничего к s строки не писать, s является строка ввода.

+0

Думаю, мне нужно немного поспать. Я понимаю свою ошибку. Это так неловко. Простите. – Jugni

0

В strcpy и strcat первый аргумент (назначение) не является константой, потому что, конечно, функция будет изменять их.

Как правило, в функции, которая модифицирует строку, первым аргументом является назначение.

Итак, правильным прототипом sscanf является «int sscanf (const char * s, const char * format, ...);», потому что он не будет изменять исходную строку, просто прочитайте ее.

Если вы не уверены в прототипе функции, человек страница об этой функции является ссылкой

0

цели сделать первый аргумент константы для функции для того, чтобы функция в доцент любым способом или способом изменить содержимое строки s во время invokation .... это обеспечить что-то вроде доступа только для чтения к строке s .....

синтаксис кажется прекрасным.

все еще сомнительно проверка man .... или любой C книжка.

0

По C99, то зсапЕ прототип:

int scanf(const char* restrict s, const char* restrict format, ...); 
0

В этом прототипе:

int sscanf (const char * s, const char * format, ...); 
  • int является только для чтения вывода, счетчик матча поле или сообщение об ошибке.
  • const char *s является только для чтения источник, из которого считываются символы.
  • const char *format - это спецификация, доступная только для чтения, для целей записи.
  • ... станет списком записываемых адресов, на которые поступает вывод преобразования, как описано в format.

Таким образом, соответственно, входной строка s, безусловно, может быть строкой только для чтения, так как это довольно важно, чтобы sscanf доверять не перезаписать вещь.

Смежные вопросы