Предположим, у меня есть следующие функции:Получить остаток строки после того, как знак был извлеченного
void readcmd(char* cmd, char* params) {
char* input;
size_t size = 0;
char* sep = "\t\v\r\f\n\b "; // separator
getline(&input, &size, stdin);
cmd = strtok(input, sep);
}
И мой вклад:
Мне нравится Stackoverflow!
В приведенном выше коде я сделал свой программный магазин первым жетоном в cmd массив. Я хочу, чтобы остальная часть предложения хранилась в массиве params; таким образом:
CMD: I
PARAMS: как Stackoverflow!
Как я могу это достичь?
Спасибо
Это также, чтобы убедиться, что 'вход = 0;' - безопасность прежде всего - даже несмотря на то, спецификация 'GetLine () 'говорит: _ Приложение должно гарантировать, что' * lineptr' является допустимым аргументом, который может быть передан функции 'free()'. Если '* n' не равно нулю, приложение должно гарантировать, что' * lineptr' либо указывает на объект размером не менее '* n' байт, либо является нулевым указателем. Вы не должны передавать неинициализированный указатель на 'free()', поэтому вы не должны передавать (адрес) неинициализированный указатель на 'getline()'. Вам также необходимо «освободить (ввести)» перед возвратом. –
Кроме того, поскольку вы не знаете, сколько пространства 'params' указывает на, вы не можете безопасно скопировать остаток строки в' params'. Аналогично 'cmd'; вы не можете сказать, насколько велика имя команды в безопасности. Я предлагаю обновить вашу функцию, чтобы иметь подпись 'void readcmd (char * cmd, size_t cmdlen, char * params, size_t paramslen)'. Кроме того, вы не проверяете наличие ошибок ('getline()' возвращает '-1', а не EOF, кстати), и вы не можете сообщить, что произошла ошибка (если не использовать одну или обе строки для пустых). –
Большое спасибо Jonathan –